在最近的项目中出现了很多包冲突,有时一下子就能猜到错误,但是有写往往需要很久都不能定位问题,尤其是项目人员参差不齐,有时为了方便私自引入一些工具类,而未考虑到项目本身。
maven的出现方便了我们的包导入,引用但是maven引入的jar包往往也引入了其余的jar包,而这往往是包冲突最隐蔽的地方,尤其是对引入的包结构不熟悉,十分难分析到问题的原因。
包冲突的迹象:
1.运行了很久的代码,突然间就报错了,而在最近的代码中又完全没有涉及到该代码的改动,或者不定时异常。
现象:a.出现方法找不到.(xxxx not found)b.类错误(xxx.xx.xx.xx.aa)报错
a.方法:找到报错的代码,删除代码中运来的引用(因为本地代码引用的jar地址往往很具体),再次引用,看会不会出现完全相同的类(包括包路径)(有些jar,也是像你一样的开发人员封装的,命名及其不规范简单),或者直接项目全局查找类名(当然类似idea,这些能查找jar包中包含的类),如果有再对比。
b.类:往往会把类的包名和类名,打印出来,但是你会发现这个包的类在这个时间段或者调用时时不会引用的 ,但是为什么还是报错了呢。也往往是在不同的jar包中包含了相同的类名(包路径相同)
c.引用的jar包又用pom依赖引用了第三方的jar包,而凑巧这个jar包在你引用的maven仓库中又能找到(虽然没用),maven就会在此jar包时加载引用的jar包,但是你本地有引用了另一版本的jar包,好那么jar包冲突的问题就来了。so,找到那个你不知道哪来的jar包,找到其本地仓库中该jar的pom依赖树,用maven的exlusion去除依赖。如果是某一个class的话另一个思路就是在启动脚本中指定该jar的加载顺序。
根源:我们打包编译完成后,jvm虚拟机运行时往往是去我们打的包中找引用的类,先找到那个就是哪个,所以就出现调用错误的问题。
2.本地运行完全没问题,但是一到测试,生产环境就报错。
声明:不一定是包冲突,更可能的情况是和环境有关。但可以考虑包冲突的问题。
方法:a.直接远程调试,但是很多环境都不支持。b.把报down下来,按照方法冲突的思路去找,然后对比包中是否有冗余导致冲突的jar包
但是总体还是的学会看错误日志,从错误日志反推找结果。
自动依赖maven的打包工具,如jekins:
私有库对于稳定版版本号jar包不同一般都不会有问题,有问题的是需要不断更新的snapshot的jar包。
依赖了maven的工具,那么该环境本地也有一个自己私有的maven库,在我们通过jar包相互调用的多系统依赖中,对于需要不断更新jar包的环境(往往是snapshot jar包),往往有一个问题就是构建工具本地私有的仓库,但是快照jar包,往往没及时更新,即使中央仓库早已更新完毕,虽然maven有一个snapshot的检测机制,但是往往都出了问题,如不手动设置,只是默认安装。这样就需要删除本地仓库的jar包,然后再次导入。我的maven仓库有问题么???求指教。。。。。
^_^热爱文字,展现内心的安宁,和思维的力量。