maven工程結(jié)構(gòu)分為繼承和集合,通過繼承可以讓多個子模塊共享配置在父模塊中的配置信息,通過集合可以讓我們在父模塊執(zhí)行命令時,遞歸的對子模塊進(jìn)行相同的處理。
下面以模塊com.mycompany.app:my-app:1
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1</version>
</project>
和模塊com.mycompany.app:my-module:1 為例來進(jìn)行說明
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-module</artifactId>
<version>1</version>
</project>
-
繼承,通過在子模塊中指定<parent> 元素來實現(xiàn)
-
場景1:子模塊所在的目錄是父模塊的子目錄
.
|-- my-module
| `-- pom.xml
`-- pom.xml
- 其中
my-module/pom.xml 是com.mycompany.app:my-module:1 的POM,pom.xml 是com.mycompany.app:my-app:1 的POM
為了把my-app 變成my-module 的父模塊,可按如下修改my-module/pom.xml
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1</version>
</parent>
<artifactId>my-module</artifactId>
</project>
- 在子模塊中追加了
<parent> 元素
- 去除了
my-module/pom.xml 中的<groupId> 和<version> ,默認(rèn)使用從父模塊繼承到的屬性值
-
場景2: 子模塊所在目錄不是父模塊的子目錄
|-- my-module
| `-- pom.xml
`-- parent
`-- pom.xml
- 其中
parent/pom.xml 是com.mycompany.app:my-app:1 的POM,這個例子也告訴我們工程目錄名parent 和artifactId 的值可以不一樣,但在實際應(yīng)用中,我們一般會保持目錄名和artifactId 一致,這里只是為了說明my-app 是父模塊
為了把my-app 變成my-module 的父模塊,可按如下修改my-module/pom.xml
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1</version>
<relativePath>../parent/pom.xml</relativePath>
</parent>
<artifactId>my-module</artifactId>
</project>
- 在
<parent> 元素中追加<relativePath> ,相對路徑的起始目錄是當(dāng)前子模塊的路徑
-
場景3: 父工程在鏡像倉庫中
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>my-module</artifactId>
<version>0.0.1-SNAPSHOT</version>
</project>
通過繼承,子模塊可以從父模塊繼承到如下元素
groupId
version
description
url
inceptionYear
organization
licenses
developers
contributors
mailingLists
scm
issueManagement
ciManagement
properties
dependencyManagement
dependencies
repositories
pluginRepositories
build
plugin executions with matching ids
plugin configuration
etc.
reporting
profiles
-
聚集,通過在父模塊中指定<modules>
一個模塊設(shè)定到父模塊的<modules> 后,當(dāng)在父模塊執(zhí)行maven命令時,將在所有子模塊中遞歸執(zhí)行
通過以下兩步可以將子模塊聚集到父模塊中
- 將父模塊
pom.xml 中的<packaging> 屬性值設(shè)置成pom
- 在父模塊中的
<modules> 元素中指定子模塊的路徑
-
場景1:子模塊所在的目錄是父模塊的子目錄
.
|-- my-module
| `-- pom.xml
`-- pom.xml
- 其中
my-module/pom.xml 是com.mycompany.app:my-module:1 的POM,pom.xml 是com.mycompany.app:my-app:1 的POM
為了把my-module 聚集到my-app 模塊下,可按如下修改my-app/pom.xml 文件
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1</version>
<packaging>pom</packaging>
<modules>
<module>my-module</module>
</modules>
</project>
- 追加
<packaging>pom</packaging> ,默認(rèn)是jar
- 追加
<modules> ,其中<module> 中指定子模塊的目錄位置,是一個相對路徑,起始路徑是父模塊的目錄
-
場景2:子模塊所在的目錄不是父模塊的子目錄
.
|-- my-module
| `-- pom.xml
`-- parent
`-- pom.xml
- 其中
parent/pom.xml 是com.mycompany.app:my-app:1 的POM
通過相對路徑把把my-module 聚集到my-app 模塊下
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1</version>
<packaging>pom</packaging>
<modules>
<module>../my-module</module>
</modules>
</project>
-
繼承 VS 聚集
當(dāng)有多個maven工程,如果想實現(xiàn)所有工程共享一些配置信息,可以采用 繼承 的模式,把公共信息配置到一個工程里,再把其他的工程中的<parent> 指向這個工程。
如果想實現(xiàn)對一批maven工程,同時進(jìn)行編譯、發(fā)布等操作,可以采用 聚集 的模式,創(chuàng)建一個parent工程,把這一批工程都作為parent工程的<modules> ,這樣我們對父工程進(jìn)行操作時,就可以遞歸的對所有module進(jìn)行處理。
當(dāng)然我們也可以同時使用繼承 和 聚集,即在子模塊中指定<parent> ,同時也在父模塊中指定<modules>
按如下模塊路徑舉例:
.
|-- my-module
| `-- pom.xml
`-- parent
`-- pom.xml
my-module/pom.xml 是com.mycompany.app:my-module:1 的POM
parent/pom.xml 是com.mycompany.app:my-app:1 的POM
此時,為了同時利用繼承和聚集,可做如下修改
com.mycompany.app:my-app:1 的POM
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1</version>
<packaging>pom</packaging>
<modules>
<module>../my-module</module>
</modules>
</project>
com.mycompany.app:my-module:1 的POM
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1</version>
<relativePath>../parent/pom.xml</relativePath>
</parent>
<artifactId>my-module</artifactId>
</project>
|