Java 管理maven不同的cglib/asm版本
我在maven有一个多模块项目,它使用了(除其他外)Java 管理maven不同的cglib/asm版本,java,maven,dependencies,sandbox,cglib,Java,Maven,Dependencies,Sandbox,Cglib,我在maven有一个多模块项目,它使用了(除其他外)glassfish jersey、jersey moxy、wicket ioc、lucene和lamdbaj这些都与asm一起提供,但都有不同的版本。 最近,我在运行测试时遇到了很多麻烦。我得到的典型错误是: java.lang.VerifyError: class net.sf.cglib.core.DebuggingClassWriter overrides final method visit.(IILjava/lang/String;L
glassfish jersey
、jersey moxy
、wicket ioc
、lucene
和lamdbaj
这些都与asm
一起提供,但都有不同的版本。最近,我在运行测试时遇到了很多麻烦。我得到的典型错误是:
java.lang.VerifyError: class net.sf.cglib.core.DebuggingClassWriter overrides final method visit.(IILjava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)V
我了解到这可能是由不同的asm
版本造成的。有没有办法将这些不同的asm版本“沙盒”在它们的依赖项中,这样它们就不会混淆
编辑:
我当前的解决方案是使用jarjar
,如下所示:
<build>
<plugins>
<plugin>
<groupId>org.sonatype.plugins</groupId>
<artifactId>jarjar-maven-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>jarjar</goal>
</goals>
<configuration>
<includes>
<include>cglib:cglib-nodep</include>
</includes>
<rules>
<rule>
<pattern>net.sf.cglib.asm.**</pattern>
<result>com.myproject.lambda4j.asm.@1</result>
</rule>
<rule>
<pattern>net.sf.cglib.**</pattern>
<result>com.myproject.lambda4j.cglib.@1</result>
</rule>
</rules>
</configuration>
</execution>
</executions>
</plugin>
org.sonatype.plugins
JarMaven插件
包裹
贾贾尔
cglib:cglibnodep
net.sf.cglib.asm**
com.myproject.lambda4j.asm@1
net.sf.cglib**
com.myproject.lambda4j.cglib@1
尝试在使用的类路径上显式添加一些cglib v3.*。您遇到的问题是cglib通过继承而不是委托来修改ASM类编写器的行为。然而,ASM通过使其ClassWriter
的方法final
实现了后一种最佳实践,同时仍然可以覆盖其方法。您遇到的错误是cglib 2.*与ASM 4.*组合的结果
幸运的是(对您来说),cglib在其最后的版本中是相当静态的,也就是说,只有少量的API更改,而较新的版本主要由ASM的更新组成。如果幸运的话,这种对cglibv3.*的显式使用可以解决您的问题。只要您的项目依赖项中没有一个直接依赖于ASM,这一点就成立了,对于您命名的依赖项(如Jersey或Lucene),这似乎是合理的
如果这不起作用,您需要在使用jarjar之类的工具时重新编译一些依赖项,以便将直接ASM依赖项重新打包到不同的名称空间中,以解决这些版本冲突。另一种方法是先通过一些有条件的子类加载程序隔离不同的ASM版本,但这并不推荐,因为其效果是不可预测的,还会导致性能损失。这正是ASM开发人员自己告诉您应该将ASM重新打包到自己的版本中的原因命名空间,而不是直接依赖它(),因为它不能保证跨版本兼容。我很想把它作为Jersey、Lucene等中的一个bug来报告。人们通常使用cglib,却不知道它在幕后使用ASM。不幸的是,Cglib并没有附带这样的警告。加入Cglib 3.1并将Cglib依赖项从其他项目中排除似乎可以达到目的。谢谢唉,这个问题在Jenkins和我的Linux环境中得到了解决;但Windows用户似乎仍在遭受这种痛苦。这不应该影响到最终在类路径上的结果。我想您的Windows人员可能会使用另一个IDE来运行该应用程序。我猜IDE在类路径中添加了一些东西。检查类路径中某台Windows计算机上的任何cglib 2.2依赖项。我想可能涉及到一些类路径缓存。使用IntelliJ时,重新导入所有Maven项目。在使用Eclipse时,请使用IntelliJ。目前,我正在使用GN JarJar重新打包libs。这似乎是目前唯一稳定的解决方案。谢谢你的支持!