MAVEN项目运行中如果报如下错误:Caused
by:java.lang.NoSuchMethodError,Caused by: java.lang.ClassNotFoundException十有八九是Maven jar包冲突造成的。
当我们需要A的依赖的时候,就会在pom.xml中引入A的jar包;而引入的A的jar包中可能又依赖B的jar包,这样Maven在解析pom.xml的时候,会依次将A、B
的jar包全部都引入进来。
当pom.xml文件中引入A、E两个依赖后,根据Maven传递依赖的原则,D1、D2都会被引入,而D1、D2是同一个依赖D的不同版本。
当我们在调用D2中的method1()方法,而D1中是15.0版本(method1可能是D升级后增加的方法),可能没有这个方法,这样JVM在加载A中D1依赖的时候,找不到method1方法,就会报NoSuchMethodError的错误,此时就产生了jar包冲突。
Maven 解析 pom.xml 文件时,同一个 jar
包只会保留一个,面对多个版本的jar包,Maven默认处理策略是包括最短路径优先(Maven 面对 D1 和 D2 时,会默认选择最短路径的那个 jar
包,即 D2。E->F->D2 比
A->B->C->D1 路径短
1)和最先声明优先(如果路径一样的话,如:
A->B->C1,
E->F->C2 ,两个依赖路径长度都是
2,那么就选择最先声明)。
规避jar冲突的思路,如果项目中有直接用到某个jar而这个jar已通过传递依赖的方式引入到maven项目里了。最好排除这个传递依赖在pom里面明确的声明这个依赖。归类依赖,不断的优化依赖如,去除多余的依赖。
我们可以借助Maven Helper插件中的Dependency
Analyzer分析冲突的jar包,然后在对应标红版本的jar包上面点击execlude,就可以将该jar包排除出去,或者手动在pom.xml中使用标签去排除冲突的jar包。
参考文档
https://blog.csdn.net/noaman_wgs/article/details/81137893
https://zhidao.baidu.com/question/2142097186618319628.html