Spring jetty-maven-plugin 中莫名其妙无法解决的 IncompatibleClassChangeError
Inexplicably unresolvable IncompatibleClassChangeError in jetty-maven-plugin with Spring
我正在处理一个 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.access0(URLClassLoader.java:73)
at java.net.URLClassLoader.run(URLClassLoader.java:367)
at java.net.URLClassLoader.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 可怕地失败了,所以它显然是必需的。
嗯,我不小心让 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 上调用时。
组件之间的远程交互总是更难调试,我猜...
我使用 mvn dependency:tree
查看了您的 pom。您混合使用了 Spring 3.2 和 3.1 JAR。 Spring 3.2 JAR 被 Restlet 引入。
[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
我正在处理一个 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.access0(URLClassLoader.java:73)
at java.net.URLClassLoader.run(URLClassLoader.java:367)
at java.net.URLClassLoader.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 可怕地失败了,所以它显然是必需的。
嗯,我不小心让 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 上调用时。
组件之间的远程交互总是更难调试,我猜...
我使用 mvn dependency:tree
查看了您的 pom。您混合使用了 Spring 3.2 和 3.1 JAR。 Spring 3.2 JAR 被 Restlet 引入。
[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