我在父pom的导入的dependencyManagement部分中指定了库的版本。我确认我的有效pom仅发生了这种依赖性。它在dependencyManagement部分中:
<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:tree打印:
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
为什么执行器与依赖关系树不一致?有什么事吗如果我使用版本限制,是否会遵守它们,我可以为此目的跳过使用强制程序吗?
此外,向相关项目模块添加依赖项不会更改任何内容。
最佳答案
Tl; dr:dependencyManagement
覆盖传递依赖项的版本
这个答案的全部功劳归功于我偶然发现的Andy Dennie的博客文章:
https://www.fizz-buzz.com/blog/2012/08/02/maven-enforcer-plugin-vs-dependencymanagementdependencyManagement
做两件事-其中之一是众所周知的,而另一则很少提及。
为子模块/子项目中的依赖项设置默认版本
覆盖传递依赖项的版本
因此,强制实施程序插件不会忽略dependencyManagement
。但是无法识别差异,因为可传递依赖项的版本在生效之前已被更改。安迪·丹尼(Andy Denny)在他的博客上对如何进行进行了很好的建议:
我不在顶级POM的dependencyManagement部分中放置依赖项。当我遇到不匹配的问题时,我想通过maven-enforcer-plugin收到警报。相反,我使用版本属性,如上面方法1中所述。
当maven-enforcer-plugin通知我有差异时,我尝试查看是否可以使用相同版本的发散性依赖项获得相关工件。如果涉及的所有依赖项都在我自己的工件中,那么我将尝试使它们与相同版本的依赖项保持一致。如果某些工件是我的工件,而某些工件来自第三方,则我尝试使我的依赖关系与第三方一致,和/或寻找具有相互一致的依赖关系版本的第三方工件的其他版本,以及我的代码。
如果执行上述操作后,仍然存在无法解决的差异,请选择我认为是问题工件的“最合适”版本,然后在项目POM的dependencyManagement部分中指定maven-enforcer-plugin报告问题(不是在我的顶级POM中)。我在该依赖项声明中为该依赖项声明添加了注释,指出了该问题和解决方法,以便将来在升级到该依赖项的较新版本时,我将看到该注释并可以重新查看差异是否可以得到解决。
这里要权衡的是,您有一个有效的执行程序插件,可以帮助您解决依赖关系,但是必须手动执行更多操作。