首页 > 编程知识 正文

maven冲突如何解决,maven依赖冲突的后果

时间:2023-05-04 03:10:09 阅读:231974 作者:2689

  一般的开发,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

运行app-web下的WebApp.main()方法,运行结果如下:

hello,worldException 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查看依赖树结构:

两种修改方法不同,两处修改的地方也不同。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。