1

我正在开发一个使用 cglib 的程序,该程序作为大型依赖包(版本 2.1_3)的一部分包含在内,并使用半熟处理器编写了一个新功能来进行一些降价到 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

我正在使用挂钩 1.4.1

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

4

1 回答 1

1

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

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

因此,ASM的常见问题解答建议:

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

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

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

于 2013-11-27T10:32:44.947 回答