依赖管理的传递效应

时间:2016-08-08 08:50:41

标签: java maven dependency-management transitive-dependency

在Maven中,您可以通过dependencyManagement中的条目覆盖传递依赖项的版本号,因为dependencyManagement优先于传递依赖项定义。

但是,(传递)依赖关系中的dependencyManagement定义呢?它们是否被考虑过?如果是这样,它们会覆盖什么,它们如何被覆盖?

2 个答案:

答案 0 :(得分:0)

依赖于传递依赖关系poms中的依赖管理定义,只要它们未在项目的dependencyManagement中被覆盖,或者更接近依赖关系(在依赖树中)。

换言之,

依赖中介:规则很简单

  • "最近的定义"这意味着它将在依赖树中使用与项目最接近的依赖项版本。

  • 如果两个依赖版本在依赖关系树中处于相同的深度,则第一个声明获胜(声明顺序)。

有关详细信息,请参阅Transitive Dependency

希望这会有所帮助。

答案 1 :(得分:0)

依赖管理隐含着传递性。对此没有必要成为一个特殊规则,而是它已经提到的规则的结果:Transitive Dependencies

考虑这个示例结构:

  • 你的模块
    • A - 依赖
      • D - 传递依赖
    • B - 依赖
      • D - 传递依赖

构建AB后,如果未明确指定,则会检查其对应的dependencyManagement部分以选择D的版本。 以下是重要部分:AB用作依赖关系时,使用完全相同的流程来确定它们所依赖的D版本上。因此,它们不会以任何方式相互影响。

例如,这可能会导致A取决于D:1.0,而B取决于D:1.1,他们的dependencyManagement部分已经应用于这一点确定了这一点,不再考虑。使用此信息作为输入,依赖关系中介规则将应用于为您的模块选择一个D版本。

链接页面中还描述了依赖关系中介规则。但简而言之,最接近的定义胜利,并且基于订单打破关系。当然,模块本身的定义总是最接近的。

现在让我们说你的模块被用作依赖项。由于D:1.2部分中的定义,您的项目可能依赖于dependencyManagement基于上述所有规则,但dependencyManagement的范围结束。

(请注意,import范围是一个例外,因为它的行为与其他范围完全不同。)