maven依赖冲突解决办法

版权声明:欢迎转载 https://blog.csdn.net/feinifi/article/details/83063094

  一般的开发,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查看依赖树结构:
在这里插入图片描述
两种修改方法不同,两处修改的地方也不同。

猜你喜欢

转载自blog.csdn.net/feinifi/article/details/83063094