java类加载中的版本冲突是一个头疼的问题,这里列举几种排查问题以及处理的常用办法
有时候在测试环境下正常的,线上部分机器也是正常,但是有一些机器就会异常,这是啥原因?
因为jar包的加载顺序在不同的机器上面是不同的,一台机器多次重启,基本的顺序不会变,但是新的jar包就会有问题
在不同的机器上,对jar包中类的加载顺序有时候不是完全一致的,例如,在/home/admin/.default/lib 目录下的有个A.jar和b.jar,里面都有个叫SayHello的class,但A的SayHello里的功能(例如他打印的是“去你的”)和b的SayHello功能(例如他打印的是“你好”)不一样,
由于不同机器加载顺序可能不一致,那么就有可能A机器上先加载了A.jar的SayHello类(会打印出“去你的”),而B机器上加载了b.jar的SayHello类(会打印出“你好”)。
这个问题在特定的机器上,其加载顺序基本不变的,因此,一旦测试的时候没问题,那他就很难再重现出此问题,只有部署到线上多台机器上时,问题才可能会暴露出来。
(1)通过maven自带的几个工具来进行分析
1、mvn dependency:list能够列举出项目中的依赖情况
2、mvn dependency:tree打印出依赖出(\-代表行尾) 这个在排除依赖的时候非常有用,通过树状结构来查看jar包的加载情况
3、mvn dependency:analyzer 这个能够分析项目中的依赖情况。
Used undeclared dependencies 是指那些在项目中直接使用到的,但没有在POM中配置的依赖。要注意一点,这个分析是编译主代码和测试代码需要的依赖,运行时需