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包的冲突依赖

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

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

(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>

修改后(保存生效,分清楚那个是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>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值