我在父pom的导入dependencyManagement部分中指定了一个库的版本。我确认我的有效pom只有一次出现这种依赖。它位于依赖管理部分:
<dependencyManagement>
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>[3.18.1-GA]</version>
</dependency>
</dependencyManagement>
这应该根据它来覆盖传递依赖的版本。安装(并重新安装依赖项以匹配版本边界)后,org.apache.maven.plugins:maven-dependency-plugin:2.8:树打印:
org.javassist:javassist:jar:3.18.1-GA:compile (version selected from constraint [3.18.1-GA,3.18.1-GA])
但是(最初,没有重新安装依赖项)执行者抱怨错误的版本:
[WARNING] Rule 1: org.apache.maven.plugins.enforcer.DependencyConvergence failed with message:
Failed while enforcing releasability the error(s) are [
Dependency convergence error for org.javassist:javassist:3.18.2-GA paths to dependency are:
...
并显示第一个传递依赖使用
org.javassist:javassist:3.18.2-GA
来自依赖性的依赖性依赖于:
<dependencies>
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.18.2-GA</version>
</dependency>
</dependencies>
和另一个使用
org.javassist:javassist:3.18.1-GA
为什么执行者与依赖树不一致?可能有什么不对?如果我使用版本边界,它们是否会得到尊重,我可以为此目的跳过使用强制执行器?
此外,向相关项目模块添加依赖项不会改变任何内容。
答案 0 :(得分:3)
Tl; dr :dependencyManagement
会覆盖传递依赖项的版本
这个答案的所有功劳归于安迪·丹尼,我的博客文章偶然发现: http://andydennie.com/2012/08/02/maven-enforcer-plugin-vs-dependencymanagement/
dependencyManagement
做两件事 - 其中一件是众所周知的,另一件很少被提及。
因此,enforcer插件不会忽略dependencyManagement
。但是由于传递依赖的版本在它开始工作之前被改变了,所以无法识别出这种差异。 Andy Denny在他的博客上提出了一个很好的建议:
- 我没有将依赖项放在顶级POM的dependencyManagement部分中。当我遇到不匹配时,我希望被maven-enforcer-plugin警告。相反,我使用版本属性,如我上面的方法#1中所述。
- 当maven-enforcer-plugin通知我有差异时,我会尝试查看是否可以使用相同的工件来使用相同版本的发散依赖项。如果涉及的所有依赖项都在我自己的工件中,我会尝试在相同版本的依赖项上对齐它们。如果某些工件是我的,有些来自第三方,我会尝试将我的依赖与第三方对齐,和/或寻找具有相互对齐的依赖版本的第三方工件的其他版本,以及我的代码。 / LI>
- 如果在完成上述操作后仍然存在无法解决的差异,我会选择我认为有问题的工件的“最适合”版本,并在项目POM的pluginManagement部分指定maven-enforcer-plugin报告的问题(不在我的顶级POM中)。我在POM中的依赖声明中添加注释,注意问题和解决方法,以便将来,如果我升级到新版本的依赖项,我会看到该注释,并可以重新审视是否可能存在差异得到解决。
醇>
这里的权衡是你有一个有效的执行者插件,可以帮助你处理依赖地狱,但必须手工完成。