10

如果我有一个 Maven 项目,它对AB 版本 2.0具有显式依赖,并且A对B 版本 1.0具有传递依赖。新版本的 B 会覆盖旧版本吗?我使用了 maven depencdy:resolve 目标,看起来旧版本的B没有解决。如果A与较新版本的B不兼容怎么办?或者,如果A依赖于B 版本 2.0并且我的项目在运行依赖项后对B 版本 1.0有显式依赖:解决目标我看不到B的更新版本。那么如何解决这些依赖关系呢?

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

4

2 回答 2

14

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

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

因此,在您的情况下,将使用 B:2.0,因为它被声明为直接依赖项。如果 A 不能与 B:2.0 一起正常工作,那么,要么在你的代码中使用 B:1.0,要么选择另一个与 A 做同样事情但不会引起冲突的库。

于 2013-11-03T15:07:33.283 回答
2

当依赖关系树中引用多个版本时,我不会选择工件的较新版本。查看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。

于 2013-11-03T15:25:24.110 回答