背景
由于历史原因,公司旧的推包策略是,包的内容更新,但版本号不更新,比如app-1.0.0.jar,每次迭代包的内容实际上是更新了的,但是版本号一直是1.0.0,这样明显不规范,且无法直观的得知自己需要的那部分功能在包内是否实现了,所以现在版本号也开始迭代,例如1.0.0更新后,可能版本号会迭代为2.0.0。
但是由于刚开始实行这个方案,会有很多问题暴露出来,其中有一个还是历史原因导致的问题就是有可能lib中的jar包会出现多版本并存的情况,也就是可能app-1.0.0.jar和app-2.0.0.jar都存在。
出现这个问题的原因主要还是项目内部不够规范,例如我的web项目需要依赖app-1.0.0.jar和core-1.1.0.jar,而core-1.1.0.jar又依赖于app-2.0.0.jar,这种情况下,maven install出来lib中就会出现app-1.0.0.jar和app-2.0.0.jar都存在的情况了。
此为背景,基于这个背景,想确认app-1.0.0.jar和app-2.0.0.jar都存在的时候,类加载的时候到底会加载哪个包的类,然后心里有个底,以后出问题也有个方向排查。
实验过程
分别打包fai-app-site 1.0.0和2.0.0到项目;
版本差异:日志输出不同,输出信息对应当前版本;
![](https://img.haomeiwen.com/i16071516/328a156b884d756f.png)
重启项目;
观察到lib中1.0.0和2.0.0共存,调用test(),日志输出
![](https://img.haomeiwen.com/i16071516/c1b9e0e33fef0005.png)
实验变量:去到lib目录下,手动将fai-app-site-1.0.0重命名为fai-app-site-3.0.0,重启项目,再次调用test()
![](https://img.haomeiwen.com/i16071516/2bb335becf0f2c0b.png)
结论
类名相同,且没有自定义类加载器的情况下,只有第一个包(lib自然排序)里面的类会被加载,根据双亲委派模型,第二个包的同个类加载的时候会被忽略;
即出现例如 fai-app-1.0.0和fai-app-2.0.0的时候,1.0.0版本会被优先加载,2.0.0里面的同类名会被忽略;
可能导致的问题:
无法读取到新版本的类。
有不同观点认为这个实验不足以说明问题,其认为包的加载顺序可能是随机的,这个实验的结果先保留,如有异议欢迎讨论
网友评论