maven依赖冲突解决办法

  一般的开发,maven依赖冲突基本不存在,但是如果项目多,依赖复杂,就说不定了。依赖冲突说明项目依赖的某一个jar包,有多个不同的版本,至少两个或两个以上,对于这种问题,最直接的就是通过修改项目依赖的版本为最新的版本即可。同时,也有另一种解决办法,就是将传递依赖剪除掉(低版本的那个依赖)。
构建如下图所示的项目,依赖关系是app-web分别依赖project-A,project-B,然后project-A依赖1.0版本的project-common(只有hello()方法),project-B依赖project-C,project-C依赖高版本的project-common(高版本中还有goodbye()方法)。项目地址:https://github.com/buejee/mavenconflictapp
maven-dependency
运行app-web下的WebApp.main()方法,运行结果如下:

hello,world
Exception in thread "main" java.lang.NoSuchMethodError: com.xxx.service.HelloWorld.goodbye()Ljava/lang/String;
	at com.xxx.adaptor.GoodbyeAdaptorService.goodbye(GoodbyeAdaptorService.java:11)
	at com.xxx.service.GoodbyeService.goodbye(GoodbyeService.java:11)
	at com.xxx.web.WebApp.goodbyeTest(WebApp.java:16)
	at com.xxx.web.WebApp.main(WebApp.java:23)

为什么project-C依赖的project-common 2.0无法被加载,原因就是maven依赖采用的是就近依赖。从上图可以看出,project-common 1.0离app-web项目最近,因为project-common 2.0和app-web中间还隔着一个project-B。
我们查看app-web项目的依赖树结构,查看命令:mvn dependency:tree -Dverbose
在这里插入图片描述
解决办法:

1、修改project-A依赖project-common为2.0版本
<dependency>
   <groupId>com.xxx</groupId>
    <artifactId>project-common</artifactId>
    <version>2.0</version>
</dependency>

修改之后,通过mvn dependency:tree -Dverbose查看依赖树,发现没有依赖冲突:
在这里插入图片描述

2、剪除依赖传递,这时候修改的文件就是app-web/pom.xml
<dependency>
     <groupId>com.xxx</groupId>
     <artifactId>project-A</artifactId>
     <version>1.0</version>
     <!--将这里注释打开就可以剪除依赖传递
     <exclusions>
         <exclusion>
             <groupId>com.xxx</groupId>
             <artifactId>project-common</artifactId>
         </exclusion>
     </exclusions>
     -->
 </dependency>
 <dependency>
     <groupId>com.xxx</groupId>
     <artifactId>project-B</artifactId>
     <version>1.0</version>
 </dependency>

修改之后,再次通过mvn dependency:tree -Dverbose查看依赖树结构:
在这里插入图片描述
两种修改方法不同,两处修改的地方也不同。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luffy5459

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值