我有一個Maven的多模塊項目,使用(其中包括)glassfish-jersey
,jersey-moxy
,wicket-ioc
,lucene
和lamdbaj
這些都帶有asm
,但都具有不同的版本。
最近,我運行測試時遇到了很多麻煩。典型的錯誤,我得到的是:管理行家不同的cglib/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>[email protected]</result>
</rule>
<rule>
<pattern>net.sf.cglib.**</pattern>
<result>[email protected]</result>
</rule>
</rules>
</configuration>
</execution>
</executions>
</plugin>
這正是ASM開發人員自己告訴你應該將asm重新打包到自己的名稱空間而不是直接依賴它的原因([FAQ#15](http://asm.ow2.org/doc/faq.html #Q15)),因爲它不保證在不同版本之間兼容。我很想將這個報告爲澤西島,Lucene等中的一個bug。 –
人們通常使用cglib而不理解它在封面下使用ASM。遺憾的是,Cglib沒有提出這樣的警告。 –