如何使用父模块来构建子模块的Maven项目?

13

我在项目中有多个模块,它们直接或者传递地相互依赖。 当我运行Maven构建“项目A”时,会自动构建“项目D”。

Project A > Project B  > Project C > Project D

where > means Project B depends on Project A

«Project D»的POM片段如下:

<project xmlns="...">
    <modelVersion>4.0.0</modelVersion>  
    <groupId>com.myProduct</groupId>
    <artifactId>build-MyProjectD</artifactId>
    <name>MyProjectD</name>
    ........
</project>

我认为,要使“项目 A”自动构建“项目 B”,需要在其中一个项目“项目 A > 项目 B > 项目 C”的pom文件中添加依赖项build-MyProjectD。但我在这些项目的pom文件中没有找到该字符串的任何引用。

有什么想法可以使子模块(在本例中为“项目 D”)的构建不需要在上游项目中存在子artifactId吗?


你可以使用 Reactor 将所有项目作为模块进行管理。这篇文章可能会有所帮助。 - Cuzz
2个回答

19
你需要创建一个聚合项目。请参考这个链接了解聚合概念的更多信息
基本上,你需要创建一个包含多个“模块”的父项目。当构建父项目时,这些模块会自动构建。
如果你在这些模块之间声明依赖关系,Maven会自动按正确顺序构建不同的模块。例如,如果“项目A”依赖于“项目B”,则首先构建“项目B”,然后再构建“项目A”,以便第二个构件的构建过程能够使用第一个构件。
另请参见Maven FAQ中的这个问题

如果我们只有两个模块,并且其中一个模块依赖于另一个模块,那么我们可以将依赖模块作为依赖项。对吧? 是的,如果我们有多个模块,最好采用聚合。不是吗? - scott miles
@scottmiles 聚合允许您将一组逻辑项目分组在一起,并一次性构建它们,而不必逐个构建它们。您可以在这些项目之间具有依赖关系,也可以没有。 - Guillaume Polet
@Guillaume Polet 同意聚合是一种方法。另一种方法可以将子项目作为依赖项添加到父模块中,这样当我们构建父模块时,不会自动构建所有子项目吗? - scott miles
@scottmiles 不太确定我理解你的问题。根据定义,子模块属于父项目(称为聚合器项目)。也许这个链接也可以帮助你。 - Guillaume Polet
我有一个聚合器,它构建父级和子级,但是在构建开始时它正在寻找父级,为什么? - Kalpesh Soni

12

对于一个父项目,Maven会在构建父项目时构建所有子模块。 将这些模块添加到你的父POM中。假设A是你的父项目。

Maven 在构建一个项目时,会检查该项目的 pom (Project Object Model) 文件,根据其中定义的内容来执行一系列操作,包括编译代码、运行测试、打包等。如果一个项目是一个父项目,它可能会包含多个子模块,这些子模块可以是其他 Maven 项目。在构建父项目时,Maven 会自动构建所有的子模块,确保每个子模块都被正确地构建和部署。

  <modules>
    <module>projectB</module>
    <module>projectC</module>
    <module>projectD</module>
  </modules>

在模块(B、C和D)中,将项目A作为父级添加(这是可选的,感谢@Guillaume Polet

 <parent>
   <groupId>foo.bar</groupId>
   <artifactId>ProjectA</artifactId>
   <version>1.0-SNAPSHOT</version>
 </parent>

因此,如果您构建projectA,则会构建ProjectB、ProjectC和ProjectD。同时,Maven足够智能,可以找出B、C和D的正确构建顺序。


4
第二步不是必需的(它被称为继承)。只需要在父POM中声明模块即可。 - Guillaume Polet
@GuillaumePolet 谢谢,我不知道。我已经更新了答案。 - Ajinkya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接