maven解决包冲突方法

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

默认版本比较定义


默认规范应组成如下:

<major>.<minor>.<revision>([ -<qualififer> ] | [ -<build> ])

这里:

  • qualififer - 限定词部分是可选的(并且是SNAPSHOT,alpha-1,alpha-2)
  • build 部分是可选的(如果指定,则从1开始递增)
  • 任何“ 0”构建或修订元素都可以省略。
  • 只能给出 build 和 qualifier 中的一个(请注意,带有时间戳的限定符包括一个 build 号,但这并不相同)


对于排序,将依次进行以下操作,直到找到不相等的元素:

  • 主要版本的数值比较
  • 次要版本的数值比较
  • 如果不存在修订,则添加“ .0”以进行比较
  • 修订的数值比较
  • 如果不存在限定符,则比限定符更新
  • 限定词不区分大小写的字符串比较
  • 这样可以确保时间戳正确排序,并且SNAPSHOT比等效时间戳更新
  • 这也可以确保beta紧跟alpha之后,就像rc一样
  • 如果没有限定符,并且构建不存在,请添加“ -0”以进行比较
  • 构建的数值比较


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

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

mvn dependency:tree


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

请下载本文的github源代码:

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

我们有一个 web 应用 resolve-web,该工程依赖于 project-Aproject-Bproject-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()两个方法。整个项目的依赖关系如下图:

5E9DFIF`{2W7Y20AL[SV]2G.png

根据Maven的transitive依赖机制,resolve-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
相关文章
|
1月前
|
Java Maven
maven jar 包冲突处理
maven jar 包冲突处理
40 0
|
1月前
|
Java Maven
【IDEA】常用快捷键和自定义方法补全(附如何设置IDEA全局配置,如Maven)
【IDEA】常用快捷键和自定义方法补全(附如何设置IDEA全局配置,如Maven)
53 0
|
9月前
|
Java Maven 开发者
又遇到maven jar包冲突了,如何快速解决
又遇到maven jar包冲突了,如何快速解决
144 0
|
Java Maven 开发者
Maven deploy配置方法
Maven deploy配置方法
810 0
|
Java Maven
Maven打包时包含资源文件和源码到jar的方法
Maven打包时包含资源文件和源码到jar的方法
303 0
|
Java 应用服务中间件 数据库连接
Maven项目中jar包冲突问题解决 导入jar包scope作用域的使用
Maven项目中jar包冲突问题解决 导入jar包scope作用域的使用
248 0
Maven项目中jar包冲突问题解决 导入jar包scope作用域的使用
|
Java 项目管理 Maven
maven下载方法配置以及相关问题解决
maven下载方法配置以及相关问题解决
326 0
maven下载方法配置以及相关问题解决
|
Java Maven
Maven 3 各版本 下载方法
各版本Maven下载方法 第一步:百度搜索Maven官网 第二步:选择下载 第三步:点击箭头所指~ 第四步:选择想下载的版本 第四步:打开归档文件 第五步: 选择对应系统的包 下载完成解压,改本地仓库和远程仓库即可
661 0
Maven 3 各版本 下载方法
|
XML Java Maven
maven父子工程遇到的bug,子module没有parent标签的解决几种方法
maven父子工程遇到的bug,子module没有parent标签的解决几种方法
644 0
maven父子工程遇到的bug,子module没有parent标签的解决几种方法