jar包冲突的一些解决方案及定位包的位置
常见的jar包冲突报错信息有:NoSuchMethodError, ClassNotFoundException, NoClassDefFoundError等等(还有个什么来着,搞忘记了)
原因:maven里引用了同一个坐标的jar的不同版本
解决方案:
1. mvn dependency:tree
mvn dependency:tree # 可以看到整个项目的jar包依赖树,在控制台
mvn dependency:tree -Dverbose # 查看完整依赖
mvn dependency:tree>tree.txt # 将依赖结果存成文件
mvn dependency:tree -Dverbose -Dincludes=*guava* # 查看某个具体的jar的依赖信息
2. Intellij插件MavenHelper
网上有很多关于这个插件的介绍和使用,可以参考
https://www.cnblogs.com/happyflyingpig/p/11238713.html
3. maven-shade-plugin
关于这个插件的介绍和原理,我也是看了下面这篇文章才明白的,大家可以参考一下。
https://zhuanlan.zhihu.com/p/62796806
前言:
在企业开发中,公司项目各模块的依赖是比较复杂,往往是A模块中依赖了B、C、D…等模块,此时我们若想在A模块中查找某个jar依赖就会很麻烦,因为无法在A的pom.xml中直接搜索到。最笨的方法就是对A模块依赖的其他模块进行逐一搜索,但我想你并不想这么做。下面我通过一个实际的案例,来简单地谈谈 IDEA 如何快捷地找到相应的pom.xml。
场景:
在项目中,我引入了org.json.JSONArray这个类,编译时期没有报错,但启动项目的时候却出现ClassNotFoundException,这让我很郁闷。后面一想,可能是该依赖的maven生命周期出现问题,所以只好先去看看该依赖的pom.xml了。
解决步骤:
1. 确定要查找jar的 artifactId
2. 打开项目的maven依赖图
3. 在依赖图上搜索上面找到的artifactId,这里是android-json
4. 在图上找到相应的元素后,鼠标双击便能进入jar的pom.xml
进来后,我们能很清楚地看到该依赖上面写着Compile编译期有效,这样问题就明确了。(如果你不相信上面的注释,可以用上面的方法,在依赖图上搜索spring-boot-configuration-processor这个jar,就会发现该依赖是<scope>provided</scope>)
5. 引入新的依赖