前言

日常遇到jar冲突时,都是多个jar版本不一样,或者加载的class不对。可以采取maven处理的方式解决,对于netty方面就比较特殊了。需要额外处理下。

netty4

netty4之前的版本包名都是org.jboss.netty 到了netty4之后,修改为io.netty
所以遇到netty冲突时,优先需要看下是不是netty大版本的之间的冲突,如果是netty3和netty4,那么不会冲突的,包名都是不一样的。

netty4 OSGi

当多个netty4版本在一起时,就容易产生冲突,发生Class或者Method不存在的情况。
netty4 分成了许多的模块,这里面主要考虑2个部分。

  1. netty-all.jar 这是netty的所有artifacts的jar,使用时,引用次模块即可,包含了所有的jar,可以像正常jar一样使用。
  2. netty-*.jar 这是netty各个模块的子模块,需要额外注意的是,netty其他的各个子模块都已经是OSGi bundles了,是可以直接在OSGi容器中使用的。

由上可知,当netty-*netty-all 版本存在时,容易冲突,由于子模块的OSGi属性,会导致JVM中加载多个相同的class存在,如此使用时,就会报错NoSuchMethodError 这种情况。

解决办法

遇到netty4和子模块的冲突,可以如下解决。

  1. 引入netty子模块的jar去exclude 各个具体的netty-* 模块,这样最后统一使用了netty-all 版本。
  2. 针对OSGi的使用方式,设计出模块之间的bundle隔离即可,参考链接处理。待尝试。

参考