Maven 基礎知識(一)工程結構
maven工程結構分為繼承和集合,通過繼承可以讓多個子模組共享配置在父模組中的配置資訊,通過集合可以讓我們在父模組執行命令時,遞迴的對子模組進行相同的處理。
下面以模組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
為例來進行說明
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-module</artifactId>
<version>1</version>
</project>
-
繼承,通過在子模組中指定
<parent>
元素來實現-
場景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>
,預設使用從父模組繼承到的屬性值
- 其中
-
場景2: 子模組所在目錄不是父模組的子目錄
|-- my-module | `-- pom.xml `-- parent `-- pom.xml
- 其中
parent/pom.xml
是com.mycompany.app:my-app:1
的POM,這個例子也告訴我們工程目錄名parent
和artifactId
的值可以不一樣,但在實際應用中,我們一般會保持目錄名和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>
,相對路徑的起始目錄是當前子模組的路徑
- 其中
通過繼承,子模組可以從父模組繼承到如下元素
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>
一個模組設定到父模組的
<modules>
後,當在父模組執行maven命令時,將在所有子模組中遞迴執行通過以下兩步可以將子模組聚集到父模組中
- 將父模組
pom.xml
中的<packaging>
屬性值設定成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>
,預設是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 聚集
當有多個maven工程,如果想實現所有工程共享一些配置資訊,可以採用 繼承 的模式,把公共資訊配置到一個工程裡,再把其他的工程中的
<parent>
指向這個工程。如果想實現對一批maven工程,同時進行編譯、釋出等操作,可以採用 聚集 的模式,建立一個parent工程,把這一批工程都作為parent工程的
<modules>
,這樣我們對父工程進行操作時,就可以遞迴的對所有module進行處理。當然我們也可以同時使用繼承 和 聚集,即在子模組中指定
<parent>
,同時也在父模組中指定<modules>
按如下模組路徑舉例:
. |-- my-module | `-- pom.xml `-- parent `-- pom.xml
my-module/pom.xml
是com.mycompany.app:my-module:1
的POMparent/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>