记一次jar包冲突问题

事情发生在兄弟部门,同事说一个环境能正常启动,另一个环境不能启动。

而且他给我演示了,不能启动又能手动启动的现象,忽略掉这句话,因为后面发现这是脚本有问题。脚本打印success了,而实际可能根本没有启动成功。

后来,查日志最后一行,是我们代码里的日志。进入代码发现,正常的后面应该还有别的日志,那么问题出现这几行代码了。通过定位,我们找到三行代码。

用try{}catch(Throwable e)把异常堆栈打出来(1),可以看到:
java.lang.NoSuchMethodError: io.netty.util.ResourceLeakDetector.addExclusion
这样的日志。

其实这时问题已经比较明显,就是netty包冲突了。就是说运行环境有多个io.netty.util.ResourceLeakDetector类,在出问题的环境使用了错误的那一个。
那么,先在本地找到这个类属于那个jar包。
再到出问题的环境看,这个jar包同名,不同版本的jar。如果要进一步明确定位,可以拿出这些包,在代码import分别查看其jar包位置。
然后在maven里排除掉相应的错误版本的jar包(2),就可以了。

但当时实际情况有点复杂,本地打不出正确的包,本地打的jar包个数与出问题环境的jar包个数不一样。导致我们只能不断的试尝改jar依赖,让运维发布来尝试,这当然是浪费时间。
中间我还尝试改出错的那几行,换实现类来解决,结果是不出这上面的错,又出别的错了。

所以,对于这种问题一般使用上面(1),(2)两步就可以解决问题了。
当然,开发环境与别的环境打的包个数最好一致,否则排除jar只能靠试,并且是让运维发。
文/程忠 浏览次数:0次   2021-02-01 06:20:09

相关阅读


评论: