前言
日常遇到jar冲突时,都是多个jar版本不一样,或者加载的class不对。可以采取maven处理的方式解决,对于netty方面就比较特殊了。需要额外处理下。
netty4
netty4之前的版本包名都是org.jboss.netty
到了netty4之后,修改为io.netty
所以遇到netty冲突时,优先需要看下是不是netty大版本的之间的冲突,如果是netty3和netty4,那么不会冲突的,包名都是不一样的。
netty4 OSGi
当多个netty4版本在一起时,就容易产生冲突,发生Class或者Method不存在的情况。
netty4 分成了许多的模块,这里面主要考虑2个部分。
- netty-all.jar 这是netty的所有artifacts的jar,使用时,引用次模块即可,包含了所有的jar,可以像正常jar一样使用。
- netty-*.jar 这是netty各个模块的子模块,需要额外注意的是,netty其他的各个子模块都已经是OSGi bundles了,是可以直接在OSGi容器中使用的。
由上可知,当netty-*
和netty-all
版本存在时,容易冲突,由于子模块的OSGi
属性,会导致JVM中加载多个相同的class存在,如此使用时,就会报错NoSuchMethodError
这种情况。
解决办法
遇到netty4和子模块的冲突,可以如下解决。
- 引入netty子模块的jar去
exclude
各个具体的netty-*
模块,这样最后统一使用了netty-all
版本。 - 针对
OSGi
的使用方式,设计出模块之间的bundle
隔离即可,参考链接处理。待尝试。
参考
- 官网netty4的升级说明: New and noteworthy in 4.0
- 官网netty4的中文说明:《NETTY官方文档》4.0的新特性及注意点
- 采取bundle思想隔离各个jar:一种解决jar包冲突的组件实现
- 报错:java报错-java.lang.NoSuchMethodError
- tomcat启动遇到NoSuchMethodError错误的排查思路