用了Maven之后,不得不说它是一个很好的用于项目构建,管理,jar包管理的工具,但是使用过程中,相信各位也遇到过jar冲突这种烦人的问题,特别是大项目,依赖的jar包比较多,很容易造成jar包冲突,jar包冲突的一个很大的原因即产类包之间的间接依赖引起的。每个显式声明的类包都会依赖于一些其它的隐式类包,这些隐式的类包会被maven间接引入进来,因而可能造成一个我们不想要的类包的载入,由此导致jar包冲突。
要解决这个问题,首先就是要查看pom.xml显式和隐式的依赖类包,然后通过这个类包树找出我们不想要的依赖类包,手工将其排除在外就可以了。
jar包冲突几乎是每个Java程序员都会遇到的问题,而且特别是大工程,jar包各种依赖,经常性发生包冲突。通常会报这样几个运行时异常:
- java.lang.NoSuchMehodError
- java.lang.NoClassDefFoundError
这类问题十有八九都是jar包冲突引起,要解决jar包冲突问题,我们先了解下导致这个冲突的原因。
导致jar包冲突的原因
1、mvn的传递依赖特性:mvn编译打包除了会引入直接申明的依赖,还会引入间接申明的依赖
2、mvn的依赖仲裁规则:
1). 按照项目总控POM的DependencyManager版本声明进行仲裁。
2). 如无仲裁声明,则按照依赖最短路径确定版本。
3). 若相同路径,有严格区间限定的版本优先。
4). 若相同路径,无版本区间,则按照先入为主原则。
3、依赖的scope会影响依赖的影响范围。
简单冲突解决的三途径!
1、根据报错的class名或方法名定位到可能导致冲突的jar包,jar包冲突引入有几种情况:
1). 引入了这个jar包的多个版本,而mvn仲裁的时候取了错误的版本,这个版本本身就缺少正确的class或方法。
2). 引入了不同坐标但是具有同名class的多个jar,mvn加载class的顺序差异会导致加载到错误的class。
2、通过mvn dependency:tree > tree.txt 导出全部的依赖。 可以使用 -Dverbose 、-Dincludes或者-Dexcludes参
数来精确定位导致冲突的jar包。
3、找到需要排除的依赖jar包,通过mvn仲裁优先的方法定义正确的jar包,或者通过exclusion的方式排除错误的jar包。
4.温馨提示:另外在项目开发中jar尽量按需引入,系统管理起来,别什么都不管直接加包进来,这样也可以在一定程度上减少jar
包冲突的风险。
推荐大家一个Java的学习网站:Java知识学习网,Java资料下载,Java学习路线图,网址:https://www.java1010.com