Parchiled和Cglib依赖冲突

时间:2013-11-26 12:05:45

标签: maven cglib parboiled

我正在开发一个使用cglib的程序,它作为大型依赖项包(版本2.1_3)的一部分包含在内,并且使用parboiled处理器编写了一个新功能来对html转换进行降价。

问题出现在依赖冲突上。 如果我什么都不做,那么我对parboiled功能的所有测试都会失败,并且会显示以下消息:

java.lang.IncompatibleClassChangeError: org/parboiled/transform/ParserClassNode

如果我包含以下排除

<exclusion>
     <groupId>asm</groupId>
     <artifactId>asm</artifactId>
</exclusion>

我声明了我的大依赖项,所有已经过的测试都会通过,但其他大多数测试都会失败,并带有

等消息
Caused by: java.lang.NoClassDefFoundError: Could not initialize class net.sf.cglib.proxy.Enhancer

我正在使用pegdown 1.4.1

有什么建议吗?浏览互联网似乎建议使用新版本的asm(4.0或更高版本,目前我的项目中的那个版本是1.5.3)可能有所帮助,但是试图排除我拥有的asm并导入后者没有帮助

1 个答案:

答案 0 :(得分:1)

问题是cglib很难迁移。这是因为:

  • 较新的cglib版本与其早期版本不兼容
  • 较新的ASM版本与其早期版本不兼容(cglib构建于asm之上)

FAQ to ASM因此建议:

  

15 如何解决全局类路径或同一ClassLoader中可用的不同ASM API版本之间的冲突?

     

使用ASM进行字节码处理的工具和框架(例如   Hibernate,CGLIB,AspectWerkz)应该在他们的内部重新打包ASM代码   自己的名字空间。这可以使用Jar Jar Links工具自动完成。

我建议你用cglib做同样的事情。将整个依赖项移动到新包中(创建一个独立的名称空间)并仅使用此依赖项。它很难看,但它是唯一的解决方案。其他项目如Spring或Hibernate以相同的方式处理cglib。