maven包冲突异常 java.lang.NoSuchMethodError

项目访问报错:
java.lang.NoSuchMethodError: org.springframework.util.ClassUtils.isPresent(Ljava/lang/String;Ljava/l
遇到问题:

A依赖于B及C,而B又依赖于X、Y,而C依赖于X、M,则A除引B及C的依赖包下,还会引入X,Y,M的依赖包(一般情况下了,Maven可通过等若干种方式控制传递依赖)。

这里有一个需要特别注意的,即B和C同时依赖于X,假设B依赖于X的1.0版本,而C依赖于X的2.0版本,A究竟依赖于X的1.0还是2.0版本呢?

这就看Classloader的加载顺序了( 应该是按照包的引入顺序进行包的加载 ),假设Classloader先加载X_1.0,而它就不会再加载X_2.0了,如果A恰恰希望使用X_2.0呢,血案就这样不期而遇了。

报错方法:
java.lang.NoSuchMethodError
1、Spring版本冲突;
2、找到使用冲突的地方,把低版本去除
错误分析:
借助Eclipse进行错误分析,有maven包的冲突依赖
maven包冲突异常 java.lang.NoSuchMethodError_第1张图片

原因分析:
借助Eclipse查看,部分冲突不影响,部分不行
原因不明,猜测: 若关联依赖的包版本差异不大,就不会影响,否则就不行

解决方案:
(1)根据问题定位关联的包,降低使用的jar包版本
2.0.7.RELEASE->1.7.0.RELEASE
maven包冲突异常 java.lang.NoSuchMethodError_第2张图片

(2)使用maven的配置方式,排除会产品冲突的jar包
假设我们不希望 org.slf4j : slf4j-api 出现,根据分析,我们知道它是经由
org.slf4j : slf4j-log4j12 引入的,那么在pom.xml中找到这个依赖,做其它的调整:
修改前:
org.slf4j
slf4j-api
1.7.6
org.slf4j
slf4j-log4j12
1.7.6
maven包冲突异常 java.lang.NoSuchMethodError_第3张图片

修改后(保存生效,分清楚那个是groupId,哪个是artifactId):
org.slf4j
slf4j-api
${slf4j.version}

org.slf4j
slf4j-log4j12
${slf4j.version}
org.slf4j
slf4j-api
maven包冲突异常 java.lang.NoSuchMethodError_第4张图片

你可能感兴趣的:(J2EE,Spring)