Maven强制执行者会忽略dependencyManagement部分吗?

sev*_*evo 5 maven maven-enforcer-plugin

我在父pom的导入的dependencyManagement部分中指定了库的版本。我确认我的有效pom仅发生了这种依赖性。它在dependencyManagement部分中:

<dependencyManagement>
    <dependency>
        <groupId>org.javassist</groupId>
        <artifactId>javassist</artifactId>
        <version>[3.18.1-GA]</version>
    </dependency>
</dependencyManagement>
Run Code Online (Sandbox Code Playgroud)

对于依赖它的传递依赖项,它应该覆盖版本。安装(并重新安装依赖项以匹配版本限制)后,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])
Run Code Online (Sandbox Code Playgroud)

但是(最初,没有重新安装依赖项)强制实施者抱怨版本错误:

[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:
...
Run Code Online (Sandbox Code Playgroud)

并显示出第一个传递依赖项的使用

org.javassist:javassist:3.18.2-GA
Run Code Online (Sandbox Code Playgroud)

依赖关系又取决于:

<dependencies>
    <dependency>
        <groupId>org.javassist</groupId>
        <artifactId>javassist</artifactId>
        <version>3.18.2-GA</version>
    </dependency>
</dependencies>
Run Code Online (Sandbox Code Playgroud)

和另一个用途

org.javassist:javassist:3.18.1-GA
Run Code Online (Sandbox Code Playgroud)

为什么强制程序与依赖关系树不一致?有什么事吗 如果我使用版本限制,是否会遵守它们,我可以为此目的跳过使用强制程序吗?

此外,将相关性添加到相关项目模块不会更改任何内容。

小智 5

Tl; drdependencyManagement覆盖传递依赖项的版本

这个答案的全部功劳归功于我偶然发现的Andy Dennie的博客文章:https :
//www.fizz-buzz.com/blog/2012/08/02/maven-enforcer-plugin-vs-dependencymanagement

dependencyManagement 做两件事-其中之一是众所周知的,而另一则很少被提及。

  1. 为子模块/子项目中的依赖项设置默认版本
  2. 覆盖传递依赖的版本

因此,强制执行器插件不会忽略dependencyManagement。但是无法识别差异,因为可传递依赖项的版本在生效之前已被更改。安迪·丹尼(Andy Denny)在他的博客上对如何进行进行了很好的建议:

  1. 我不在顶级POM的dependencyManagement部分中放置依赖项。当我遇到不匹配时,我想被maven-enforcer-plugin通知。相反,我使用版本属性,如上面方法1中所述。
  2. 当maven-enforcer-plugin通知我有差异时,我尝试查看是否可以使用相同版本的发散依赖项来获取工件。如果涉及的所有依赖项都在我自己的工件中,则尝试使它们与相同版本的依赖项保持一致。如果某些工件是我的工件,而某些工件来自第三方,则我尝试使我的依赖关系与第三方保持一致,和/或寻找具有相互依存版本的第三方工件的其他版本以及我的代码。
  3. 如果执行上述操作后,仍然存在无法解决的差异,请选择我认为是问题工件的“最合适”版本,然后在项目POM的dependencyManagement部分中指定maven-enforcer-plugin报告该问题(不是在我的顶层POM中)。我在该依赖项声明中为该依赖项声明添加了注释,指出了该问题和解决方法,以便将来在升级到该依赖项的较新版本时,我将看到该注释并可以重新查看差异是否可以得到解决。

这里要权衡的是,您有一个有效的执行程序插件,可以帮助您解决依赖关系,但是必须手动执行更多操作。