Maven的聚合模型是如何符合其依赖机制的?

lae*_*tis 3 inheritance dependencies aggregation maven

我的问题比较简单。我确实有一个项目,它有一个典型的带有依赖管理的父 pom 和一个带有“正常”继承这些依赖的 pom 的模块。

如果我在继承的 pom 中明确命名父级,则项目构建成功,但如果我省略父级信息,则项目无法构建。

人们期望 maven 能够正常构建这个项目,因为聚合 pom 列出了所有模块以及依赖项管理。

为什么不是这样?

Tun*_*aki 5

因为您将继承聚合混合在一起

在 Maven 中,继承意味着为这个 POM 声明一个父 POM(带有<parent>标签元素)。默认情况下,每个 POM 都继承自 Super POM。这种继承允许分解出父级内部的常见依赖项(如插件版本或依赖项管理)。

另一方面,聚合是多模块项目的同义词。这意味着聚合器项目声明子模块(带有<module>标签元素)。

即使它不常用,您也可以拥有一个聚合子模块的项目,这些子模块的父模块不是该项目。看到父项目也是聚合器项目是很常见的,但这不是必需的。因此,在您的情况下构建失败,因为您遇到了不再是父项目的聚合器项目的情况,因此子模块不会从其配置继承。

引用Maven 文档

POM 项目可以继承自——但不一定具有——它聚合的任何模块。相反,一个 POM 项目可能会聚合不继承自它的项目。


进一步阅读:

  • Maven 书:多模块与继承(选引):

    从父项目继承和由多模块项目管理是有区别的。父项目是将其值传递给子项目的项目。多模块项目只是管理一组其他子项目或模块。多模块关系是从最顶层向下定义的。设置多模块项目时,您只是告诉项目它的构建应该包含指定的模块。多模块构建用于在单个构建中将模块组合在一起。父子关系是从叶子节点向上定义的。父子关系更多地涉及特定项目的定义。当您将子项与其父项相关联时,您是在告诉 Maven 一个项目的 POM 是从另一个派生而来的。

  • Maven 文档:项目继承与项目聚合(选定引用):

    如果您有多个 Maven 项目,并且它们都有相似的配置,您可以通过拉出那些相似的配置并创建一个父项目来重构您的项目。因此,您所要做的就是让您的 Maven 项目继承该父项目,然后这些配置将应用于所有这些项目。

    如果您有一组一起构建或处理的项目,您可以创建一个父项目并让该父项目将这些项目声明为其模块。通过这样做,您只需要构建父级,其余的将随之而来。