【问题标题】:Inexplicably unresolvable IncompatibleClassChangeError in jetty-maven-plugin with Spring使用Spring的jetty-maven-plugin中莫名其妙无法解决的IncompatibleClassChangeError
【发布时间】:2015-05-06 01:41:24
【问题描述】:

我正在处理一个 Restlet 应用程序问题,并认为最好设置一个包含应用程序缩减版本的 Github 存储库以进行测试。然而,这从来没有那么容易......

存储库在这里:https://github.com/morungos/restlet-spring-static-files

基本上,问题是每当我尝试使用mvn jetty:run-war 运行它(我实际上需要这样做来测试restlet 问题)时,都会得到以下回溯:

java.lang.IncompatibleClassChangeError: class org.springframework.cglib.core.DebuggingClassWriter has interface org.springframework.asm.ClassVisitor as super class
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:455)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:367)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:415)
at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:377)
at org.springframework.cglib.core.DefaultGeneratorStrategy.getClassVisitor(DefaultGeneratorStrategy.java:30)

有趣的部分是原始应用程序——即使我让它使用完全相同的pom.xml,对于相同的命令也没有显示相同的问题。 mvn jetty:run 似乎都很好,但是 Restlet 问题需要一个 war 文件来测试。

现在我已经看到了这个问题,它通常是 ASM/CGLIB 冲突,当我检查依赖项时,Jetty 和 Spring 都使用不同的 ASM 系统,但我想知道在哪里或如何设置依赖项以使其正确工作。即使我可以,我也无法弄清楚为什么它可以在一个应用程序中工作,而不是在一个稍微小一点的版本中(遗憾的是我还不能展示)。

关于如何解决这个问题的任何想法?我尝试向导致问题的 Jetty 依赖项添加排除项(jetty-annotations),但后来 Jetty 严重失败,因此显然是必需的。

【问题讨论】:

    标签: java spring maven jetty maven-jetty-plugin


    【解决方案1】:

    嗯,我不小心让 Spring 和 Restlets 解决了他们的分歧。显式引入所有 Spring 依赖项,而不仅仅是我需要的几个,这一切都不同了。 Spring 的 runtime 范围也悄悄进入。

    我所做的只是将以下顶级依赖项添加到 POM:

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>
    

    当我仔细返回时,我可以看到该应用程序引入了 3.1.4 和 3.2.6 版本,并将它们混合在一起。令人惊讶的是,除了 Jetty 之外,一切似乎都运行良好,而且只有在 WAR 上调用时。

    组件之间的远程交互总是更难调试,我猜...

    【讨论】:

      【解决方案2】:

      我使用 mvn dependency:tree 查看了您的 pom。您混合了 Spring 3.2 和 3.1 JAR。 Restlet 正在引入 Spring 3.2 JAR。

      [INFO] +- org.restlet.jee:org.restlet:jar:2.3.1:compile
      [INFO] +- org.restlet.jee:org.restlet.ext.servlet:jar:2.3.1:compile
      [INFO] +- org.restlet.jee:org.restlet.ext.spring:jar:2.3.1:compile
      [INFO] |  +- cglib:cglib-nodep:jar:2.2:compile
      [INFO] |  +- commons-logging:commons-logging:jar:1.1.3:compile
      [INFO] |  +- org.springframework:spring-beans:jar:3.2.6.RELEASE:compile
      [INFO] |  +- org.springframework:spring-core:jar:3.2.6.RELEASE:compile
      [INFO] |  +- org.springframework:spring-expression:jar:3.2.6.RELEASE:compile
      [INFO] |  +- org.springframework:spring-web:jar:3.2.6.RELEASE:compile
      [INFO] |  |  \- aopalliance:aopalliance:jar:1.0:compile
      [INFO] |  \- org.springframework:spring-webmvc:jar:3.2.6.RELEASE:compile
      [INFO] +- javax.servlet:javax.servlet-api:jar:3.0.1:compile
      [INFO] +- org.springframework:spring-context:jar:3.1.4.RELEASE:runtime
      [INFO] |  +- org.springframework:spring-aop:jar:3.1.4.RELEASE:compile
      [INFO] |  \- org.springframework:spring-asm:jar:3.1.4.RELEASE:compile
      [INFO] +- org.slf4j:slf4j-api:jar:1.7.7:compile
      [INFO] +- org.slf4j:slf4j-jdk14:jar:1.7.7:compile
      [INFO] \- junit:junit:jar:4.9:test
      [INFO]    \- org.hamcrest:hamcrest-core:jar:1.1:test
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多