解决JAR包冲突问题

最近因为项目大版本调整,各个模块需要进行适配验证。而我负责的模块啥都没有修改,居然跑不起来,感觉很是纳闷。于是不断的打断点调测,发现在本地运行一切正常,但是一到环境中就出问题,关键还没有错误日志打出,很是迷惑。迫不得已情况下只能慢慢加打印,看具体问题出在哪个步骤。终于皇天不负有心人,在耗时半天,尝试变换加了不下10次打印信息,在调用一个jar包方法时,程序跑飞了。可调用的jar包,我明明有的,而且本地运行验证也没有问题,于是立刻将问题锁定在jar包冲突上。因为我的模块是被一个大的进程加载的,而各个进程间又没有隔离,就看哪个jar包优先被加载使用了,很容易冲突。于是在linux环境下,使用了grep -r 在大进程路径下进行搜索,瞬间就查找出包含对应方法的jar包,进而逐步排除解决问题。虽然问题解决了,但是一天的时间也就为了这么个小问题而浪费了,更是觉得可惜,遂记录下来。对于这个问题不仅框架存在问题,需要优化,同时也要考虑在后续如何避免或快速定位,于是在网上搜索关于jar包冲突的相关解决方法,汇总如下:

所谓的jar包冲突,整体上包含两种情况,第一种情况是包的版本冲突,某个class文件在两个不同版本的jar包,还有一种情况是jar包的版本相互依赖。

现象 :在开发测试时一切正常, 一旦部署到正式服务器上, 就会出现以下几类异常: 
1, java类找不到 java.lang.ClassNotFoundException 
2, 方法不存在 java.lang.NoSuchMethodError 
3, 字段不存在 java.lang.NoSuchFieldError 
4, 类错误 java.lang.LinkageError 

当JVM需要某个Class时,它先看JVM内部有没有这个Class,如果有就直接使用,如果没有才在类路径下加载新的JAR。如果JVM加载到A-x.jar,但实现上我们却需要A-y.jar,那么问题就出现了。另外,classLoader加载顺序是不排序的,依赖于底层文件系统的顺序,每个inode中保存了文件系统的一个文件对象的元信息存储,简单的将就是文件在扇区中的索引值。

另外,网上很多都是讲解maven排除对应jar包的方法,暂时没用到就不添加了。

猜你喜欢

转载自blog.csdn.net/lanyue1/article/details/85487826