在 Maven 中,您可以通过 dependencyManagement 中的条目覆盖传递依赖项的版本号,因为 dependencyManagement 优先于传递依赖项定义。
但是(传递)依赖项的 pom 中的 dependencyManagement 定义呢?他们被考虑了吗?如果是这样,它们覆盖了什么,它们是如何被覆盖的?
最佳答案
依赖管理暗示是可传递的。不需要为此制定特殊规则,而是已经提到的规则的结果:Transitive Dependencies .
考虑这个示例结构:
- 你的模块
A
- 依赖D
- 传递依赖
B
- 依赖D
- 传递依赖
当 A
或 B
构建时,它们相应的 dependencyManagement
部分被检查以选择 D
的版本,如果没有明确指定。 这是重要的部分:当 A
或 B
用作依赖项以确定 D< 的版本时,使用完全相同的过程
他们依赖。因此,它们不会以任何方式相互影响。
例如,这可能导致 A
取决于 D:1.0
,而 B
取决于 D:1.1
,它们的 dependencyManagement
部分已经在此时应用以确定这一点,将不再考虑。将此信息作为输入,应用依赖调解规则为您的模块只选择一个版本的 D
。
依赖调解规则也在链接页面中描述。但简而言之,最接近的定义获胜,平局根据顺序被打破。自然地,模块本身中的定义总是最接近的。
现在假设您的模块被用作依赖项。由于 dependencyManagement
部分中的定义,您的项目可能依赖于基于上述所有规则的 D:1.2
,但这就是您的 dependencyManagement的范围
结束。
(请注意,import
作用域是一个异常(exception),因为它的行为与其他作用域完全不同。)
关于java - dependencyManagement 的传递效应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38824870/