为什么Maven不能覆盖传递的范围?

时间:2018-10-28 18:37:58

标签: java maven

这是我没想到的Maven有趣的状况。也许有人可以确切解释为什么会这样。

我有一个父POM foobar-parent,它在logback-classic部分中声明了一个test范围的<dependencyManagement>

我有一个单独的项目项目example,它有自己的example-parent,该项目继承自foobar-parent,并且也是其子模块的父项。

一个子模块example-foo覆盖依赖项logback-classic并赋予其compile范围:

<dependency>
  <groupId>ch.qos.logback</groupId>
  <artifactId>logback-classic</artifactId>
  <scope>compile</scope>
</dependency>

最后,我还有另一个子模块example-bar,它使用example-foo作为依赖项。

奇怪的是,对于example-bar的有效POM,它表明logback-classic具有test的范围!由于example-foo声明logback-classic属于compile范围(这意味着在编译时是必需的),并且由于example-bar具有对example-foo的编译时依赖性,我希望example-bar引入logback-classic作为传递依赖。

我的解释方式是,父POM的test管理部分中指定的<dependencyManagement>范围将覆盖compile范围的传递依赖项的范围!这是正确的解释吗?Maven应该如何工作?

1 个答案:

答案 0 :(得分:2)

您是对的:“对于传递性依赖关系,依赖关系管理优先于依赖关系中介”(摘自Introduction to the Dependency Mechanism