关于maven包冲突的一些思路
在最近的项目中出现了很多包冲突,有时一下子就能猜到错误,但是有写往往需要很久都不能定位问题,尤其是项目人员参差不齐,有时为了方便私自引入一些工具类,而未考虑到项目本身。
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仓库有问题么???求指教。。。。。
^_^热爱文字,展现内心的安宁,和思维的力量。
关于maven包冲突的一些思路的更多相关文章
- IDEAL葵花宝典:java代码开发规范插件 (maven helper)解决maven 包冲突的问题
小编说到: 在我们日常开发当中常常我们会遇到JAR包冲突.找来找去还找不到很是烦人.那么所谓的JAR包冲突是指的什么那?JAR包冲突就是-引入的同一个JAR包却有好几个版本. 例如: 项目中引用了两个 ...
- idea 中解决maven 包冲突的问题(maven helper)
转:链接 一.冲突问题 比如项目中引用了两个 fastjson.jar的版本,分别为 fastjson:1.2.28fastjson:1.2.3 我们用到了1.2.28中的某个类, 比如 A类,在版本 ...
- maven依赖包冲突解决思路
1.显示依赖关系mvn dependency:tree > tree.txt显示所有依赖关系,并输出到text.txtmvn dependency:tree -Dverbose > tre ...
- 重新看待Jar包冲突问题及解决方案
Jar包冲突是老生常谈的问题,几乎每一个Java程序猿都不可避免地遇到过,并且也都能想到通常的原因一般是同一个Jar包由于maven传递依赖等原因被引进了多个不同的版本而导致,可采用依赖排除.依赖管理 ...
- 正确配置jstl的maven依赖,jar包冲突的问题终于解决啦
困扰了两天的问题,非常头疼,今天终于有了解决思路了,说到底,还是对maven不够了解吧.总是抱怨maven不好用,出现各种无厘头的问题,原来这些都是归于对它不够了解不够熟悉,它提供了很好的解决思路,只 ...
- Maven类包冲突终极解决方案
本文转自:http://ian.wang/106.htm 举例A依赖于B及C,而B又依赖于X.Y,而C依赖于X.M,则A除引B及C的依赖包下,还会引入X,Y,M的依赖包(一般情况下了,Maven可通过 ...
- Maven 解决JAR包冲突
在JAR 冲突的情况下, 利用Eclipse方式解决JAR包冲突时比较方便简洁的,步骤如下 1. 在Eclipse 中打开pom.xml , 选择 “Dependency Hierarchy” 2 ...
- 一点解决版本冲突的应急思路、怎样在所有jar包文件中搜索冲突的方法?
maven是一个很好的项目管理工具,你可以轻松的定义一个引用,从而达到使用别人写好的库的作用.且maven可以轻松地和jenkins配合,从而使打包部署变得更容易. 但是也因为这样,我们变得更傻瓜了, ...
- maven隐式依赖引起的包冲突
包冲突 使用maven管理项目时可能会遇到包冲突的情况比如:log4j-over-slf4j.jar 和 slf4j-log4j12.jar这两个包同时一起运行时就会有问题. 这种冲突可能是显式依赖导 ...
随机推荐
- eclipse JavaEE版"javax.servlet.http.HttpServlet" was not found on the Java Build Path问题的解决办法
使用eclipse JavaEE 版,新建 Dynamic Web Project 项目.在项目里添加 JSP 文件,会在文件头部出现错误提示.提示语句为:The superclass "j ...
- 微信小程序,时间戳转为日期格式
//数据转化 function formatNumber(n) { n = n.toString() ] ? n : ' + n } /** * 时间戳转化为年 月 日 时 分 秒 * number: ...
- Memcached集群:Magent缓存代理使用
小结: 先启动memcached 然后启动magent memcached -d -p 11211 -u memcached -m 64 -c 5120 memcached -d -p 11212 - ...
- 用JavaCV改写“100行代码实现最简单的基于FFMPEG+SDL的视频播放器 ”
FFMPEG的文档少,JavaCV的文档就更少了.从网上找到这篇100行代码实现最简单的基于FFMPEG+SDL的视频播放器.地址是http://blog.csdn.net/leixiaohua102 ...
- ASP.NET控件属性大全
ASP.NET控件属性大全 DataGridView 控件DataGridView 控件提供用来显示数据的可自定义表.使用 DataGridView 类,可以自定义单元格.行.列和边框. 注意Data ...
- python通过日志分析加入黑名单
监控nginx日志,若有人攻击,则加入黑名单,操作步骤如下:1.读取日志文件2.分隔文件,取出ip3.将取出的ip放入list,然后判读ip的次数4.若超过设定的次数,则加入黑名单 日志信息如下: 1 ...
- 第十五篇:流迭代器 + 算法灵活控制IO流
前言 标准算法配合迭代器使用太美妙了,使我们对容器(数据)的处理更加得心应手.那么,能不能对IO流也使用标准算法呢?有人认为不能,他们说因为IO流不是容器,没有迭代器,故无法使用标准算法.他们错了,错 ...
- iOS-layoutSubvies和drawRect何时调用
- 170110、Spring 事物机制总结
spring两种事物处理机制,一是声明式事物,二是编程式事物 声明式事物 1)Spring的声明式事务管理在底层是建立在AOP的基础之上的.其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加 ...
- Windows File 管理工具:junction And Subinacl
junction.exe 是 Sysinternals 出品的命令行工具.使用前建议将其复制到%SystemRoot%/system32目录下 创建一个名为 D:/LINK 的[junction ...