java.lang.NoClassDefFoundError: org/objectweb/asm/ClassVisitor

Java.net JIRA | gazmoo | 3 years ago
tip
Click on the to mark the solution that helps you, Samebug will learn from it.
As a community member, you’ll be rewarded for you help.
  1. 0

    When embedding Jersey in a standalone Java app, I've specified a set of singleton resources in my ResourceConfig using {noformat} resourceConfig.registerInstances(resources); {noformat} I then publish the resources in Jetty using {noformat} webabbContext.add(new ServletHolder(new ServletContainer(resourceConfig)), pathToJersey); {noformat} I excluded the repackaged ASM jars in my Maven POM because of a conflict with other libraries in the application: {noformat} <exclusion> <groupId>org.glassfish.hk2.external</groupId> <artifactId>asm-all-repackaged</artifactId> </exclusion> {noformat} However, when the servlets are initialised, the following exception is thrown: {noformat} java.lang.NoClassDefFoundError: org/objectweb/asm/ClassVisitor at org.glassfish.jersey.server.ResourceConfig.scanClasses(ResourceConfig.java:875) at org.glassfish.jersey.server.ResourceConfig._getClasses(ResourceConfig.java:840) at org.glassfish.jersey.server.ResourceConfig.getClasses(ResourceConfig.java:755) at org.glassfish.jersey.server.ResourceConfig$RuntimeConfig.<init>(ResourceConfig.java:1171) at org.glassfish.jersey.server.ResourceConfig$RuntimeConfig.<init>(ResourceConfig.java:1144) at org.glassfish.jersey.server.ResourceConfig.createRuntimeConfig(ResourceConfig.java:1140) at org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:299) at org.glassfish.jersey.servlet.WebComponent.<init>(WebComponent.java:311) at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:169) at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:359) at javax.servlet.GenericServlet.init(GenericServlet.java:244) at com.gaz.test.JerseySpringSingletonBeansServlet.init(JerseySpringSingletonBeansServlet.java:43) at org.eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:542) at org.eclipse.jetty.servlet.ServletHolder.initialize(ServletHolder.java:351) at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:800) at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:288) at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1322) at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:731) at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:490) at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:69) at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:108) at org.eclipse.jetty.server.Server.start(Server.java:342) at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:90) at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:58) at org.eclipse.jetty.server.Server.doStart(Server.java:290) at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:69) at Main.start(Main.java:68) at Main.main(Main.java:17) {noformat} There appears to be no easy way to prevent the exception. Debugging the application, I noted that the {{ResourceConfig._getClasses()}} method does not return any classes in my case - it does not attempt to do any scanning, but the ClassVisitor is still instantiated in the AnnotationAcceptingListener constructor, throwing the exception. I've worked around it temporarily by extending the ResourceConfig class and overriding the _getClasses() method to just return an empty set. I had to extend it in the same package, because the method is package private. I could not use the Application class instead of the ResourceConfig class because the ServletContainer only accepts a ResourceConfig. It could be fixed a number of ways: * Allow users to completely disable classpath scanning, and don't attempt to create ASM objects if it's disabled * Make the ResourceConfig more easily extensible for customisation * Hide all implementation details of classpath scanning (move the bundled ASM into a different package to avoid conflicts)

    Java.net JIRA | 3 years ago | gazmoo
    java.lang.NoClassDefFoundError: org/objectweb/asm/ClassVisitor

    Root Cause Analysis

    1. java.lang.NoClassDefFoundError

      org/objectweb/asm/ClassVisitor

      at org.glassfish.jersey.server.ResourceConfig.scanClasses()
    2. jersey-core-server
      ApplicationHandler.<init>
      1. org.glassfish.jersey.server.ResourceConfig.scanClasses(ResourceConfig.java:875)
      2. org.glassfish.jersey.server.ResourceConfig._getClasses(ResourceConfig.java:840)
      3. org.glassfish.jersey.server.ResourceConfig.getClasses(ResourceConfig.java:755)
      4. org.glassfish.jersey.server.ResourceConfig$RuntimeConfig.<init>(ResourceConfig.java:1171)
      5. org.glassfish.jersey.server.ResourceConfig$RuntimeConfig.<init>(ResourceConfig.java:1144)
      6. org.glassfish.jersey.server.ResourceConfig.createRuntimeConfig(ResourceConfig.java:1140)
      7. org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:299)
      7 frames
    3. jersey-container-servlet-core
      ServletContainer.init
      1. org.glassfish.jersey.servlet.WebComponent.<init>(WebComponent.java:311)
      2. org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:169)
      3. org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:359)
      3 frames
    4. JavaServlet
      GenericServlet.init
      1. javax.servlet.GenericServlet.init(GenericServlet.java:244)
      1 frame
    5. com.gaz.test
      JerseySpringSingletonBeansServlet.init
      1. com.gaz.test.JerseySpringSingletonBeansServlet.init(JerseySpringSingletonBeansServlet.java:43)
      1 frame
    6. Jetty
      AbstractLifeCycle.start
      1. org.eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:542)
      2. org.eclipse.jetty.servlet.ServletHolder.initialize(ServletHolder.java:351)
      3. org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:800)
      4. org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:288)
      5. org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1322)
      6. org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:731)
      7. org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:490)
      8. org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:69)
      9. org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:108)
      10. org.eclipse.jetty.server.Server.start(Server.java:342)
      11. org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:90)
      12. org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:58)
      13. org.eclipse.jetty.server.Server.doStart(Server.java:290)
      14. org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:69)
      14 frames
    7. Unknown
      Main.main
      1. Main.start(Main.java:68)
      2. Main.main(Main.java:17)
      2 frames