我们遇到了 Maven 选择了一个不一致的间接依赖版本的情况,我想了解为什么,以及将来如何防止这种情况。
我们的 pom.xml 文件具有以下依赖项:
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>1.1.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>3.1.2.RELEASE</version>
</dependency>
但没有直接依赖于spring-core。
两者都依赖于 spring-core:spring-web 3.1.2.RELEASE 依赖于 spring-core 3.1.2.RELEASE(参见它的 pom-file),而 spring-data-jpa 1.1.0.RELEASE 依赖于任意 3。 x 版本的 spring-core(准确地说是 [3.0.7.RELEASE,4.0.0.RELEASE),参见它的 pom-file)。
结合两者,我希望 Maven 选择 spring-core 版本 3.1.2.RELEASE。但是,事实并非如此。相反,它从范围 [3.0.7.RELEASE,4.0.0.RELEASE) 中选择最高值,当前为 3.2.0.RELEASE。
(复制场景:将上面的 pom.xml 文件(gist)放在它自己的目录中,然后运行mvn dependency:tree -Dverbose=true
:对我来说,结果就是这棵树(gist)。对于 Linux 上的 Maven 2.2.1 和 Maven 3.0,我得到相同的结果。 4 在 Windows 上。)
这似乎是错误的,因为它不一致:使用了 spring-web 的 pom 文件不允许的 spring-core 版本。
(当 spring-core 3.2.0.RC1 可用时,我们发生了这种情况:在下一次更新时,它突然被选中,我们很幸运,由于 spring-core 3.1 和 3.2 之间的不兼容更改而导致构建错误。但是下次我们可能就没有那么幸运了,并且出现了很难追踪的运行时错误。)
呃:我只是注意到声明的顺序<dependency>
很重要:如果我把 spring-web 放在第一位,那么 spring-core 3.1.2.RELEASE被选中。是什么赋予了?
问题:我们如何让 Maven 选择一致的间接依赖版本,或者至少在它做出的选择与 pom 文件中指定的版本背道而驰时发出警告?
更新:我在这里要求一个通用的解决方案。对于这种特定情况,我知道我可以通过在 中添加依赖项来获得正确的行为,并<dependencyManagement>
指定我总是想要 spring-core 3.1.2.RELEASE。但是,我希望 Maven 在没有此类特定声明的情况下做正确的事情 (TM)。