【发布时间】:2014-01-23 07:49:53
【问题描述】:
我在 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;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>
【问题讨论】:
-
这正是 ASM 开发人员自己告诉您应该将 asm 重新打包到自己的命名空间而不是直接依赖它的原因 (FAQ #15),因为不能保证跨版本兼容。我很想将此报告为 Jersey、Lucene 等中的错误。
-
人们通常在使用 cglib 时并不了解它在幕后使用 ASM。不幸的是,Cglib 没有这样的警告。
标签: java maven dependencies sandbox cglib