我正在开发一个使用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并导入后者没有帮助
答案 0 :(得分:1)
问题是cglib很难迁移。这是因为:
FAQ to ASM因此建议:
15 如何解决全局类路径或同一ClassLoader中可用的不同ASM API版本之间的冲突?
使用ASM进行字节码处理的工具和框架(例如 Hibernate,CGLIB,AspectWerkz)应该在他们的内部重新打包ASM代码 自己的名字空间。这可以使用Jar Jar Links工具自动完成。
我建议你用cglib做同样的事情。将整个依赖项移动到新包中(创建一个独立的名称空间)并仅使用此依赖项。它很难看,但它是唯一的解决方案。其他项目如Spring或Hibernate以相同的方式处理cglib。