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

时间:2015-12-07 15:59:53

标签: maven inheritance dependencies aggregation

我的问题相对简单。我有一个项目,它有一个带有依赖关系管理的典型父pom和一个带有“normaly”继承这些依赖关系的pom的模块。

如果我在继承的pom中明确命名父项,那么项目会成功构建,但是如果我省略了父信息,那么项目就无法构建。

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

为什么不是这样?

1 个答案:

答案 0 :(得分:4)

因为您正在将继承聚合混合使用。

在Maven中,inheritance表示为此POM声明父POM(使用<parent>标记元素)。默认情况下,每个POM都继承自Super POM。此继承允许分解父内部的公共依赖项(如插件版本或依赖项管理)。

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

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

引用Maven docs

  

POM项目可以从 - 但不一定 - 继承 - 它聚合的任何模块。相反,POM项目可能会聚合不从中继承的项目。

进一步阅读:

  • Maven书:Multi-module vs. Inheritance(精选报价):
      

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

  • Maven documentaton:Project Inheritance vs Project Aggregation(选定报价):
      

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

         

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