Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 管理maven不同的cglib/asm版本_Java_Maven_Dependencies_Sandbox_Cglib - Fatal编程技术网

Java 管理maven不同的cglib/asm版本

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

我在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>

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。这似乎是目前唯一稳定的解决方案。谢谢你的支持!