Maven 父 POM 与 BOM 依赖管理

Maven parent POM vs BOM dependency management

假设我有一个 Maven 父 POM root,它在依赖管理中定义了 foo:bar:1.0.0。我有另一个父级 POM parent,它使用 root 作为父级(只是为了向示例添加另一层)。最后,我有一个物料清单 bom,它使用 root 作为其父项,但在其依赖项管理中重新定义了 foo:bar:2.0.0

在我的项目app中,我继承自parent,然后在app

的依赖管理部分import the BOM
root (foo:bar:1.0.0) <- parent <- app+bom
 ^
 |
bom (foo:bar:2.0.0)

哪个依赖管理部分获胜?我得到哪个版本的 foo:bar

我知道,如果我直接将 foo:bar 包含在 app 的依赖管理部分,它会覆盖从父级继承的。但是在依赖管理部分importing一个BOM就等于直接把它包含在依赖管理部分,并且足以覆盖父级的BOM吗?还是继承自父级依赖管理的foo:bar优先?

根据 maven 优先级规则,root 中的版本将获胜,因此您将获得 foo:bar:1.0.0,如果查看有效的 POM,您将能够看到。我认为这会降低 BOM 项目的效率,因为您不能使用它来覆盖来自父级的版本并且必须在应用程序或父级中声明版本。

The Precedence

So, there are multiple ways of deciding the versions, which means there is an order of precedence.

  • Versions provided in the direct declaration in POM take the highest precedence.
  • Version provided in parent pom takes second precedence.
  • Version from imported pom takes third place
  • Lastly, whatever we get from dependency mediation