背景:
项目一个版本已迭代测试一段时间,负责登录的组件,在某台真机上出现如下报错:期间其他测试人员的环境正常
奇怪的线索:
a. 相同 jdk环境1.8.0_131下仅在某个机器上出现问题(该机器必现) 其他机器正常
b. 报错位置里 红色框两个类属于同一个jar包
怎么同一个jar里还出现解析不到?而且仅在一台服务上这样。当前这个jar包也没有多个出现但是版本不同的情况呀。
后来请教老大,说这种在一台机器上出现,基本上就是jar包冲突问题了,为什么其他环境没出现,基本是看运气,和类与jar的加载顺序有关,主要操作系统的文件系统类型决定。如果不是同一个jar的版本冲突,可能还是相关jar包的版本冲突。
解决办法:保证hibernate相关版本一致后,问题得到解决。
如图:
只是升级了这个一个jar包版本到5.4.21后,程序在发现的环境上部署后确认已修复。
结论: 不要觉得只在一台机器上出现就怀疑环境的问题,仍然最开始怀疑的就是jar冲突问题。尤其是本包内的调用NoSuchMethodError问题。
后续分析:
导致jar包加载顺序问题原因,可能是不同机器文件系统类型不一致,后续确认,我的机器的文件系统类型一致(df -T),都是ext4。但我的操作系统内核centos版本有差异(cat /etc/redhat-release),有问题的是centos6.5,其他是6.10或者6.8。
关于jar包加载顺序问题,很好的一个文章 https://www.jianshu.com/p/dcad5330b06f 可以阅读。