美文网首页
Java - 关于在lib中同一个jar包不同版本并存的小实验

Java - 关于在lib中同一个jar包不同版本并存的小实验

作者: lonmao | 来源:发表于2021-07-20 15:00 被阅读0次

背景

由于历史原因,公司旧的推包策略是,包的内容更新,但版本号不更新,比如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到项目;
版本差异:日志输出不同,输出信息对应当前版本;


test()实现

重启项目;
观察到lib中1.0.0和2.0.0共存,调用test(),日志输出


lib中1.0.0和2.0.0包共存时调用test()的日志输出

实验变量:去到lib目录下,手动将fai-app-site-1.0.0重命名为fai-app-site-3.0.0,重启项目,再次调用test()

lib中重命名1.0.0为3.0.0时调用test()的日志输出

结论

类名相同,且没有自定义类加载器的情况下,只有第一个包(lib自然排序)里面的类会被加载,根据双亲委派模型,第二个包的同个类加载的时候会被忽略;
即出现例如 fai-app-1.0.0和fai-app-2.0.0的时候,1.0.0版本会被优先加载,2.0.0里面的同类名会被忽略;

可能导致的问题:
无法读取到新版本的类。

有不同观点认为这个实验不足以说明问题,其认为包的加载顺序可能是随机的,这个实验的结果先保留,如有异议欢迎讨论

相关文章

网友评论

      本文标题:Java - 关于在lib中同一个jar包不同版本并存的小实验

      本文链接:https://www.haomeiwen.com/subject/yytrmltx.html