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可通过<scope>等若干种方式控制传递依赖)。

这里有一个需要特别注意的,即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

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

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

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

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

<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
maven包冲突异常 java.lang.NoSuchMethodError