项目访问报错:
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包的冲突依赖
![](https://i-blog.csdnimg.cn/blog_migrate/67e7aca097adb62dd5bfcf1c900d4eb2.png)
原因分析:
借助Eclipse查看,部分冲突不影响,部分不行
原因不明,猜测:
若关联依赖的包版本差异不大,就不会影响,否则就不行
解决方案:
(1)根据问题定位关联的包,降低使用的jar包版本
2.0.7.RELEASE->1.7.0.RELEASE
![](https://i-blog.csdnimg.cn/blog_migrate/cd6c006ece268644b852c2aba5051625.png)
(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>
![](https://i-blog.csdnimg.cn/blog_migrate/3fabc23fd12714d1dadfda11bbb90729.png)
修改后(保存生效,分清楚那个是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>
![](https://i-blog.csdnimg.cn/blog_migrate/74dcf4327b05f0f91d20a0ac1d4417bb.png)