Maven选择了不一致的间接依赖版本:为什么,以及如何防止?

Maven选择了不一致的间接依赖版本:为什么,以及如何防止?,maven,dependency-management,Maven,Dependency Management,我们遇到了这样一种情况,Maven选择了一个不一致的间接依赖版本,我想了解为什么,以及将来如何防止这种情况 我们的pom.xml文件具有以下依赖项: <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-jpa</artifactId> <version>1.1.0.RELEASE</version&

我们遇到了这样一种情况,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>

org.springframework.data
),而spring数据jpa 1.1.0.RELEASE依赖于任意3.x版本的spring core(确切地说[3.0.7.RELEASE,4.0.0.RELEASE],请参阅)

结合两者,我希望Maven选择SpringCoreVersion3.1.2.RELEASE。但是,它没有。相反,它选择范围[3.0.7.RELEASE,4.0.0.RELEASE]中的最高版本,目前是3.2.0.RELEASE

(复制场景:将(gist)放在自己的目录中,然后运行
mvn dependency:tree-Dverbose=true
:对于我来说,结果是(gist)。对于Linux上的Maven 2.2.1和Windows上的Maven 3.0.4,我都得到了相同的结果。)

这似乎是错误的,因为它是不一致的:使用了SpringWeb的pom文件不允许的SpringCore版本

(当spring core 3.2.0.RC1可用时,我们就遇到了这种情况:在下一次更新时,它突然被选中,我们很幸运,因为spring core 3.1和3.2之间的不兼容更改导致了生成错误。但下一次我们可能就不那么幸运了,并且有很难跟踪的运行时错误。)

Urghh:我只是注意到
声明的顺序很重要:如果我先放置SpringWeb,那么选择SpringCore3.1.2.RELEASE。会给出什么

问:我们如何让Maven选择间接依赖项的一致版本,或者如果它做出了与pom文件中指定的版本相反的选择,至少发出警告


更新:我在这里要求一个通用的解决方案。对于这个特定的案例,我知道我可以通过在
中添加一个依赖项来获得正确的行为,指定我始终希望spring core 3.1.2.RELEASE。但是,我希望Maven做正确的事情(TM)没有这样的特定声明。

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

您所期望的似乎是合乎逻辑的,但Maven没有机会这样做。它只是在不知道
spring data jpa
可能有什么事情要做的情况下解析依赖项带
弹簧芯

依赖项解析的工作方式与您描述的相同:

依赖项中介-这决定了依赖项的版本 将在遇到工件的多个版本时使用。 目前,Maven 2.0仅支持使用“最近的定义” 这意味着它将使用最接近的依赖项的版本 您的项目在依赖关系树中。您始终可以保证 请注意,如果 两个依赖项版本在依赖项树中的深度相同, 在Maven 2.0.8之前,还没有定义哪一个会赢,但从那时起 Maven 2.0.9重要的是声明中的顺序:第一个 宣言获胜

因此,我认为防止这种情况的唯一方法是意识到这一点,并在自己的pom中明确设置所需的版本

顺便问一下,您为什么认为“这似乎是错误的,因为它是不一致的:使用了SpringCore的一个版本,而SpringWeb的pom文件不允许这样做。”


x.y
的版本规范只是使用此版本的建议(请参见“注意”)。如果您打算强制使用此版本,则必须设置
[x.y]

是的,我知道一旦我知道我处于这种问题的情况,我可以要求Maven选择某些依赖项,或者使用
。但我的问题是如何防止这种情况:如果A完全依赖于B的V版本,我如何防止Maven选择W版本,或者至少让它警告我?我已经更新了qu感谢你的解释!如果Maven忽略了一个建议(在本例中是SpringWeb的建议),那么有没有一种方法可以被警告——或者更好:破坏构建?@Marnix Klooster查看一下插件提供的目标。有一些分析可能性,但我不确定您的需求是否得到满足。与此同时,Spring团队启动了一个项目,该项目提供了一个最佳组合Spring(和依赖库)版本的包。