较新版本的依赖项是否会覆盖maven项目中的旧版本?

时间:2013-11-03 14:53:13

标签: java maven

如果我的maven项目明确依赖于 A B版本2.0 A B具有传递依赖性版本1.0 。 B的较新版本是否会覆盖旧版本? 我使用了maven depencdy:解决目标,看起来旧版 B 未解决。如果 A 与较新版本的 B 不兼容怎么办?或者,如果 A 依赖于 B版本2.0 ,并且我的项目在运行依赖项后明确依赖 B版本1.0 :解决目标我看不到更新版 B 然后。那么这些依赖关系如何得到解决呢?

当我使用resolve目标时,它会显示依赖关系。但是这个依赖关系将在哪个阶段使用?编译,测试,运行时?

2 个答案:

答案 0 :(得分:13)

首选更接近依赖关系树根目录的版本。如果两个冲突的版本在树中具有相同的深度,则第一个(从树的顶部开始)获胜。

这是一个完全愚蠢的规则吗?是的。它的唯一优势是您可以通过将其声明为项目的直接依赖项来强制执行特定版本的依赖项。

所以在你的情况下,将使用B:2.0,因为它被声明为直接依赖。如果A在B:2.0中不能正常工作,那么,在代码中使用B:1.0,或者选择与A完全相同但不会引起冲突的其他库。

答案 1 :(得分:1)

在依赖关系树中引用多个版本时,我不会选择较新版本的工件。看http://maven.apache.org/plugins/maven-dependency-plugin/examples/resolving-conflicts-using-the-dependency-tree.html,它似乎从树的根中选择最接近的定义。这意味着主POM中的版本将优先于传递依赖中的版本。因此,如果相反,您的项目依赖于B v1.0并且A对B v2.0具有传递依赖性,那么您的项目将选择B v1.0。