2014-11-17 49 views
2

我已经在父pom的导入的dependencyManagement部分中指定了一个库的版本。我证实我的有效pom只有一次发生这种依赖。它位于dependencyManagement部分:maven执行者是否忽略dependencyManagement部分?

<dependencyManagement> 
    <dependency> 
     <groupId>org.javassist</groupId> 
     <artifactId>javassist</artifactId> 
     <version>[3.18.1-GA]</version> 
    </dependency> 
</dependencyManagement> 

这应该覆盖传递依赖关系的版本,具体取决于它。 Maven的依赖关系的插件:2.8:树印:在安装(和重新安装依赖匹配版本范围),org.apache.maven.plugins后

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 

为什么实施者与依赖关系树不一致?什么可能是错的?如果我使用版本界限,他们会受到尊重,我可以跳过使用执行者为此目的?

另外,向相关项目模块添加依赖项并不会改变任何内容。

回答

2

文艺青年最爱的dependencyManagement覆盖传递依赖的版本

所有的功劳这个答案去安迪·丹尼其博客文章中,我偶然发现:
http://andydennie.com/2012/08/02/maven-enforcer-plugin-vs-dependencymanagement/

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

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

的版本,所以执法者插件不能忽略dependencyManagement。但无法识别这种差异,因为传递依赖的版本在上手之前已被修改。安迪·丹尼对如何继续在自己的博客一个很好的建议:

  1. 我不把依赖于我的顶层POM的dependencyManagement部分。当我有不匹配时,我想通过maven-enforcer插件提醒。相反,我使用版本属性,如上面的方法#1所述。
  2. 当maven-enforcer-plugin通知我有差异时,我尝试查看是否可以获取涉及的工件以使用相同版本的发散依赖关系。如果所涉及的所有依赖都在我自己的工件中,我试图让它们在相同版本的依赖关系上对齐。如果有些工件是我的,有些来自第三方,我会尝试将我的依赖与第三方对齐,和/或查找其他版本的第三方工件,这些工件具有彼此对齐的依赖版本和我的代码。
  3. 如果在完成上述操作后,我仍然有无法解析的差异,我选择我认为是问题工件的“最适合”版本,并指定在项目POM的pluginManagement部分中maven-enforcer-plugin报告问题(不在我的顶级POM中)。我在该POM中的依赖声明中添加了一条注释,指出该问题和解决方法,以便将来我应该升级到更新版本的依赖项时,我会看到该注释并可以重新检查该差异是否可能会解决。

权衡这里是你有一个工作的实施者插件,可以帮助您与依赖地狱,但必须用手工做的更多。