maven解决包冲突方法详解

  

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

  

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

        mvn依赖性:树      

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

  

请下载本文的github源代码:

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

  

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

  

 maven解决包冲突方法详解

  

根据Maven的传递依赖机制,resolve-web将同时依赖于工程常用的1.0和2.0版本,这就造成了依赖冲突。而根据最近获胜策略,Maven将选择工程常用的1.0版本作为最终的依赖。

  

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

  

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

        [信息]resolve-web: resolve-web:战争:1.0快照   [信息]+ - junit: junit: jar: 3.8.1:测试   [信息]+ -项目b:项目b: jar: 1.0:编译   [信息]| \ - project-C: project-C: jar: 1.0:编译   [信息]| \(工程常用:project-commmon: jar: 2.0:编译-省略与1.0冲突)   [信息]+——:—:jar: 1.0:编译   [信息]| \ -工程常用:project-commmon: jar: 1.0:编译   \[信息]- javax.servlet: servlet api: jar: 2.4: 之前提供      

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

maven解决包冲突方法详解