maven解决包冲突方法详解

网友投稿 442 2023-07-15

maven解决包冲突方法详解

maven解决包冲突方法详解

Maven根据最近胜利策略(nearest wins strategy)的原则工作,同时解决依赖冲突,这意味着它在依赖树中找到更接近的版本,它将采用该版本并忽略其他版本。实际上Maven有点懒,所以每当它开始寻找依赖时,它就会从根目录开始遍历树,无论它先前找到哪个版本,它都会选择它并从它们返回而不进一步。如果它进一步寻找依赖版本,可能会有机找到一些更新的版本,但它从第一个发现的版本那里返回,并采用旧版本并用它来解决依赖关系。

可以用下面的命令显示依赖树:

mvn dependency:tree

老实说,这不是maven的错,因为它想尽快完成这项工作。最重要的是,maven 不知道你的应用程序期望哪个版本,所以Maven会告诉你,嘿,你有责任让我知道你想要哪个版本,如果你不告诉我,我会以自己的方式工作,即更近更好。

请-本文的github源代码

https://github.com/yujiaao/maven-dependency-conflict-demo

我们有一个 web 应用 resolve-web,该工程依赖于 project-A 和project-B,project-A 依赖于 project-common 的 1.0 版本并调用其中的 sayHello() 方法。project-B 依赖于project-C,而project-C又进一步依赖于project-common的2.0 版本并调用其中的 sayGoodBye() 方法。project-common 的 1.0 和 2.0 版本是不同的,1.0 中之包含sayHello() 方法,而2.0 中包含了sayHello()和sayGoodBye()两个方法。整个项目的依赖关系如下图:

根据Maven的transitive依赖机制,reIfxsDADlLesolve-web 将同时依赖于project-common 的 1.0 和 2.0 版本,这就造成了依赖冲突。而根据最近获胜策略,Maven 将选择 project-common 的 1.0 版本作为最终的依赖。

这和 Gradle 不同,Gradle 在默认情况下将选择最新的版本作为获胜版本。

而对于Maven,由于proejct-common的1.0版本比2.0版本在依赖树中离resolve-web更近,故 1.0 版本获胜。在 resolve-web 中执行mvn dependency:tree -Dverbose 可以看到 resolve-web 的依赖关系:

[INFO] resolve-web:resolve-web:war:1.0-SNAPSHOT

[INFO] +- junit:junit:jar:3.8.1:test

[INFO] +- project-B:project-B:jar:1.0:compile

[INFO] | \- project-C:project-C:jar:1.0:compile

[INFO] | \- (project-common:project-commmon:jar:2.0:compile - omitted for conflict with 1.0)

[INFO] +- project-A:project-A:jar:1.0:compile

[INFO] | \- project-common:project-commmon:jar:1.0:compile

[INFO] \- javax.servlet:servlet-api:jar:2.4:provided

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:JDK8新特性之判空遍历写法
下一篇:Springboot整合Shiro的代码实例
相关文章

 发表评论

暂时没有评论,来抢沙发吧~