Maven依赖冲突:快照没有优先级

时间:2012-05-24 15:48:46

标签: maven maven-3

当依赖树中存在冲突(相同工件但版本不同)时,AFAIK,Maven将通过选择最高版本的依赖关系来解决冲突,并省略“旧”依赖关系。

然而,当较新的版本是SNAPSHOT时,显然它会选择比SNAPSHOT更旧的稳定版本。

在我的情况下:some-artifact:0.5.0-SNAPSHOTS(与0.4.0冲突省略)=>版本0.4.0是在想要的0.5.0-SNAPSHOT上挑选的。

我认为这个功能是按设计的,但我不明白原因。接下来,任何想法是否有办法告诉Maven在稳定版本上使用SNAPSHOT?

3 个答案:

答案 0 :(得分:2)

您对Maven始终选择最高版本的假设并不准确。工件的选择基于许多因素,包括树中依赖关系的深度,树中的顺序,依赖关系是快照还是发布,以及依赖关系管理,它几乎覆盖了其他所有因素。

不幸的是,我不知道任何一个关于Maven依赖性解析算法的确切信息来源。你会发现它的各个部分分散在各处。一些方便的参考文献:

  • Introduction to the Dependency Mechanism概述了该主题,并在Transitive Dependencies上提供了一个很好的(如果简短的)部分,以及如何从依赖关系树中选择它们。
  • Sonatype Maven书籍对Project Dependencies的一般内容有一个更全面的部分,这将增加你对这个主题的了解。
  • 同一本书的前一部分讨论了Project Versions,它与这个问题密切相关,并且在SNAPSHOT版本上有一个很好的部分,尽管没有我希望它们如何在依赖解析中发挥作用。< / LI>
  • Project Relationships讨论了坐标系以及项目继承如何影响依赖项的包含。
  • 最后,POM Reference是几乎与pom有关的好起点。至少有一个简短的描述,每个pom元素可以帮助您理解足够的内容,以便能够有效地开始搜索更多信息。

至于一些实用的建议,mvn dependency:tree的输出在发现为什么选择特定版本的依赖项时非常有用。它甚至经常会告诉你类似“foo:bar:1.2(1.1)”的内容。一旦确定了错误版本的来源,就可以通过多种方法确保项目使用特定的依赖版本:

答案 1 :(得分:1)

如果通过POM中的另一个依赖项将0.4.0版本作为传递依赖项引入,那么您应该能够exclude它。 dependency:tree目标可以帮助您了解这是否正在发生。

答案 2 :(得分:0)

Maven旨在支持快照版本的发布版本。我不确定为什么你会在同一个POM中有两个依赖项而无法通过删除一个来解决冲突,所以我假设其中一个依赖项是从父pom继承的。在这种情况下,您可以将继承的依赖项设置为<optional>true</optional>,并且我 THINK 它应该允许子POM覆盖它,即使版本较低。

糟糕/黑客的解决方案如果不起作用 - 编辑本地存储库的方式是它没有意识到0.5.0版本是快照(如果你有能力甚至可以编辑你的私有nexus repo )