我的问题相对简单。我有一个项目,它有一个带有依赖关系管理的典型父pom和一个带有“normaly”继承这些依赖关系的pom的模块。
如果我在继承的pom中明确命名父项,那么项目会成功构建,但是如果我省略了父信息,那么项目就无法构建。
人们希望maven能够正常构建这个项目,因为聚合pom列出了所有模块以及依赖关系管理。
为什么不是这样?
答案 0 :(得分:4)
因为您正在将继承与聚合混合使用。
在Maven中,inheritance表示为此POM声明父POM(使用<parent>
标记元素)。默认情况下,每个POM都继承自Super POM。此继承允许分解父内部的公共依赖项(如插件版本或依赖项管理)。
另一方面,aggregation是多模块项目的同义词。这意味着聚合器项目声明了子模块(带有<module>
标记元素)。
即使它不常用,您也可以拥有一个项目来聚合其父项不是此项目的子模块。看到父项目也是聚合项目是很常见的,但它并不是必需的。因此,在您的情况下构建失败,因为您已经到达不再是父项目的聚合器项目的情况,因此子模块不会从其配置继承。
引用Maven docs:
POM项目可以从 - 但不一定 - 继承 - 它聚合的任何模块。相反,POM项目可能会聚合不从中继承的项目。
进一步阅读:
从父项目继承和由多模块项目管理之间存在差异。父项目是将其值传递给其子项的项目。多模块项目只管理一组其他子项目或模块。多模块关系从最顶层向下定义。在设置多模块项目时,您只是告诉项目其构建应包含指定的模块。多模块构建将用于在单个构建中将模块组合在一起。父子关系是从叶节点向上定义的。父子关系更多地涉及特定项目的定义。当您将子项与其父项关联时,您告诉Maven项目的POM是从另一项派生的。
如果你有几个Maven项目,并且它们都有类似的配置,你可以通过拉出那些类似的配置并制作一个父项目来重构你的项目。因此,您所要做的就是让您的Maven项目继承该父项目,然后将这些配置应用于所有这些项目。
如果您有一组一起构建或处理的项目,您可以创建一个父项目并让该父项目将这些项目声明为其模块。通过这样做,您只需要建立父母,其余的将跟随。