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依赖冲突解决办法_第1张图片
运行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
maven依赖冲突解决办法_第2张图片
解决办法:

1、修改project-A依赖project-common为2.0版本

<dependency>
   <groupId>com.xxxgroupId>
    <artifactId>project-commonartifactId>
    <version>2.0version>
dependency>

修改之后,通过mvn dependency:tree -Dverbose查看依赖树,发现没有依赖冲突:
maven依赖冲突解决办法_第3张图片

2、剪除依赖传递,这时候修改的文件就是app-web/pom.xml

<dependency>
     <groupId>com.xxxgroupId>
     <artifactId>project-AartifactId>
     <version>1.0version>
     
 dependency>
 <dependency>
     <groupId>com.xxxgroupId>
     <artifactId>project-BartifactId>
     <version>1.0version>
 dependency>

修改之后,再次通过mvn dependency:tree -Dverbose查看依赖树结构:
maven依赖冲突解决办法_第4张图片
两种修改方法不同,两处修改的地方也不同。

你可能感兴趣的:(java)