iT邦幫忙

2025 iThome 鐵人賽

DAY 10
0
Software Development

我們與Maven的距離系列 第 16

Day 15 - Project Inheritance

  • 分享至 

  • xImage
  •  

前言

有的時候專案太大包會很難一目了然專案的組成架構,於是會將專案分拆模組讓模組的功能職責更為明確,甚至能夠將模組分享給其他專案團隊使用,今日我們就來看看這個部分吧

什麼是 Maven 繼承 (Project Inheritance)

Maven 繼承是一種讓子專案能夠從父專案繼承配置資訊的機制,可以把它想為Java的繼承概念。透過這個機制,子專案可以自動獲得父專案定義的設置:

可繼承的元素:

  • 依賴管理 (<dependencyManagement>):統一管理依賴版本
  • 插件配置 (<pluginManagement>):統一Plugin版本和配置
  • 專案資訊:groupId、version、description 等基本資訊
  • 屬性設定 (<properties>):共用的屬性變數

Maven繼承的好處

Maven 繼承機制為多模組專案帶來了許多實質的好處,讓專案管理變得更加高效且一致:

1. 統一依賴版本管理

避免不同模組使用不同版本的依賴,減少版本衝突的風險。

<!-- 父專案統一定義版本 -->
<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>

2. 減少重複配置:父專案統一配置,子模組自動繼承

<!-- 父專案:一次配置 -->
<properties>
    <maven.compiler.source>21</maven.compiler.source>
    <maven.compiler.target>21</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<!-- 子模組:自動繼承,無需重複配置 -->

3. 集中式版本控制

當需要升級依賴版本時,只需要在父專案修改一次,所有子模組自動更新。

<!-- 只需要在父專案修改一個地方 -->
<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>

Maven繼承範例演示

我們來嘗試創建一個繼承架構的模組專案吧

步驟一:建立父專案 (Parent Project)

首先建立一個父專案作為其他模組的根節點:

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

重要設定

  1. 刪除 src 資料夾(父專案不需要原始碼)
  2. 修改 pom.xml,設定打包類型為 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>

Reference


上一篇
Day14 - Dependency Management
系列文
我們與Maven的距離16
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言