|
maven工程結(jié)構(gòu)分為繼承和集合,通過繼承可以讓多個(gè)子模塊共享配置在父模塊中的配置信息,通過集合可以讓我們?cè)诟改K執(zhí)行命令時(shí),遞歸的對(duì)子模塊進(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>元素來實(shí)現(xiàn)
-
場(chǎng)景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)使用從父模塊繼承到的屬性值
-
場(chǎng)景2: 子模塊所在目錄不是父模塊的子目錄
|-- my-module
| `-- pom.xml
`-- parent
`-- pom.xml
- 其中
parent/pom.xml是com.mycompany.app:my-app:1的POM,這個(gè)例子也告訴我們工程目錄名parent和artifactId的值可以不一樣,但在實(shí)際應(yīng)用中,我們一般會(huì)保持目錄名和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>,相對(duì)路徑的起始目錄是當(dāng)前子模塊的路徑
-
場(chǎng)景3: 父工程在鏡像倉(cāng)庫(kù)中
<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>
一個(gè)模塊設(shè)定到父模塊的<modules>后,當(dāng)在父模塊執(zhí)行maven命令時(shí),將在所有子模塊中遞歸執(zhí)行
通過以下兩步可以將子模塊聚集到父模塊中
- 將父模塊
pom.xml中的<packaging>屬性值設(shè)置成pom
- 在父模塊中的
<modules>元素中指定子模塊的路徑
-
場(chǎng)景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>中指定子模塊的目錄位置,是一個(gè)相對(duì)路徑,起始路徑是父模塊的目錄
-
場(chǎng)景2:子模塊所在的目錄不是父模塊的子目錄
.
|-- my-module
| `-- pom.xml
`-- parent
`-- pom.xml
- 其中
parent/pom.xml是com.mycompany.app:my-app:1的POM
通過相對(duì)路徑把把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)有多個(gè)maven工程,如果想實(shí)現(xiàn)所有工程共享一些配置信息,可以采用 繼承 的模式,把公共信息配置到一個(gè)工程里,再把其他的工程中的<parent>指向這個(gè)工程。
如果想實(shí)現(xiàn)對(duì)一批maven工程,同時(shí)進(jìn)行編譯、發(fā)布等操作,可以采用 聚集 的模式,創(chuàng)建一個(gè)parent工程,把這一批工程都作為parent工程的<modules>,這樣我們對(duì)父工程進(jìn)行操作時(shí),就可以遞歸的對(duì)所有module進(jìn)行處理。
當(dāng)然我們也可以同時(shí)使用繼承 和 聚集,即在子模塊中指定<parent>,同時(shí)也在父模塊中指定<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
此時(shí),為了同時(shí)利用繼承和聚集,可做如下修改
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>
|