5

我们遇到了 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)。

4

2 回答 2

7

所期望的似乎是合乎逻辑的,但 Maven 没有机会这样做。它只是在没有spring-data-jpa可能与spring-core.

依赖项解析按此处描述的方式工作,并且是您已经描述的方式:

依赖中介——这决定了当遇到工件的多个版本时将使用哪个版本的依赖。目前,Maven 2.0 仅支持使用“最近定义”,这意味着它将使用依赖树中与您的项目最接近的依赖版本。您始终可以通过在项目的 POM 中明确声明来保证版本。请注意,如果两个依赖版本在依赖树中的深度相同,则在 Maven 2.0.8 之前没有定义哪个会获胜,但从 Maven 2.0.9 开始,声明中的顺序很重要:第一个声明获胜。

所以我认为防止这种情况的唯一方法是意识到它并在你自己的 pom.xml 中明确设置你需要的版本。

顺便说一句,为什么您认为“这似乎是错误的,因为它不一致:使用了 spring-web 的 pom-file 不允许的 spring-core 版本。 ”?

的版本规范<version>x.y</version>只是使用此版本的建议(请参阅此处的“注释”)。如果你打算强制使用这个版本,你必须设置<version>[x.y]</version>.

于 2013-01-24T13:39:01.110 回答
0

在您的依赖项声明中,您可以添加部分以定义间接依赖项以不为此依赖项导入。

于 2013-01-24T08:09:27.963 回答