有的時候專案太大包會很難一目了然專案的組成架構,於是會將專案分拆模組讓模組的功能職責更為明確,甚至能夠將模組分享給其他專案團隊使用,今日我們就來看看這個部分吧
Maven 繼承是一種讓子專案能夠從父專案繼承配置資訊的機制,可以把它想為Java的繼承概念。透過這個機制,子專案可以自動獲得父專案定義的設置:
<dependencyManagement>
):統一管理依賴版本<pluginManagement>
):統一Plugin版本和配置<properties>
):共用的屬性變數Maven 繼承機制為多模組專案帶來了許多實質的好處,讓專案管理變得更加高效且一致:
避免不同模組使用不同版本的依賴,減少版本衝突的風險。
<!-- 父專案統一定義版本 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
子模組只需要設置
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<!-- 不需填寫version -->
<scope>test</scope>
</dependency>
</dependencies>
<!-- 父專案:一次配置 -->
<properties>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!-- 子模組:自動繼承,無需重複配置 -->
當需要升級依賴版本時,只需要在父專案修改一次,所有子模組自動更新。
<!-- 只需要在父專案修改一個地方 -->
<properties>
<spring.version>5.3.21</spring.version> <!-- 升級到新版本 -->
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
我們來嘗試創建一個繼承架構的模組專案吧
首先建立一個父專案作為其他模組的根節點:
mvn archetype:generate \
-DarchetypeGroupId=org.apache.maven.archetypes \
-DarchetypeArtifactId=maven-archetype-simple \
-DarchetypeVersion=1.5 \
-DgroupId=com.mycompany \
-DartifactId=day15-inheritance-project \
-Dversion=1.0.0
進入專案目錄並進行父專案設定:
cd day15-inheritance-project
重要設定:
pom
:<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany</groupId>
<artifactId>day15-inheritance-project</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging> <!-- 關鍵設定:父專案必須是 pom 類型 -->
<!-- 統一依賴版本管理 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 統一屬性設定 -->
<properties>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>
在父專案目錄下建立各個子模組:
# 核心模組 (JAR)
mvn archetype:generate \
-DarchetypeGroupId=org.apache.maven.archetypes \
-DarchetypeArtifactId=maven-archetype-quickstart \
-DarchetypeVersion=1.5 \
-DgroupId=com.mycompany \
-DartifactId=core \
-Dversion=1.0.0
# 服務模組 (JAR)
mvn archetype:generate \
-DarchetypeGroupId=org.apache.maven.archetypes \
-DarchetypeArtifactId=maven-archetype-quickstart \
-DarchetypeVersion=1.5 \
-DgroupId=com.mycompany \
-DartifactId=service \
-Dversion=1.0.0
# Web 模組 (WAR)
mvn archetype:generate \
-DarchetypeGroupId=org.apache.maven.archetypes \
-DarchetypeArtifactId=maven-archetype-webapp \
-DarchetypeVersion=1.5 \
-DgroupId=com.mycompany \
-DartifactId=web \
-Dversion=1.0.0
# 基礎設施模組 (JAR)
mvn archetype:generate \
-DarchetypeGroupId=org.apache.maven.archetypes \
-DarchetypeArtifactId=maven-archetype-quickstart \
-DarchetypeVersion=1.5 \
-DgroupId=com.mycompany \
-DartifactId=infrastructure \
-Dversion=1.0.0
子模組下的
完成後的專案結構應該如下:
day15-inheritance-project/ ← 父專案
├── pom.xml ← 父 POM
├── core/ ← 核心模組
│ ├── pom.xml ← 子 POM (自動包含 parent 標籤)
│ └── src/
│ ├── main/java/
│ └── test/java/
├── service/ ← 服務模組
│ ├── pom.xml
│ └── src/
├── web/ ← Web 模組
│ ├── pom.xml
│ └── src/
│ └── main/
│ ├── java/
│ └── webapp/
└── infrastructure/ ← 基礎設施模組
├── pom.xml
└── src/
查看任一子模組的 pom.xml
,會發現自動新增了 <parent>
標籤:
<project>
<!-- 繼承父專案 -->
<parent>
<groupId>com.mycompany</groupId>
<artifactId>day15-inheritance-project</artifactId>
<version>1.0.0</version>
</parent>
<!-- 子專案只需要定義 artifactId -->
<artifactId>core</artifactId>
<!-- groupId 和 version 自動從父專案繼承 -->
<dependencies>
<!-- 版本號自動從父專案的 dependencyManagement 繼承 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>