Eclipse IDE 中的 Maven 多模組專案與 POM 結構

Eclipse Maven 多模組教學:建立 Parent、Module 與 POM

在 Eclipse 建立一般 Maven Project 不難,但當專案要拆成 Web、共用工具或其他功能模組時,父 POM、Module 與模組相依關係就容易混在一起。這篇沿用 Eclipse 的 Maven Project/Maven Module 操作流程,從父專案開始,建立一個 Web 模組與一個共用 JAR 模組,最後確認整個多模組專案能一起建置。

完成後的結構:父專案只負責聚合與共用設定,使用 pom packaging;功能模組依用途選擇 jarwar。多數現代 Java 應用與 Spring Boot 專案使用 jar 即可,只有要部署到外部 Servlet 容器的傳統 Web 應用才通常需要 war
demo-parent/
├─ pom.xml                 # packaging=pom,聚合全部模組
├─ demo-web/
│  └─ pom.xml              # jar 或 war,依部署方式決定
└─ demo-common/
   └─ pom.xml              # jar,共用工具或領域程式碼

開始前先確認 Eclipse 與 Maven 環境

Eclipse 需要安裝 Maven Integration for Eclipse(m2e)。Eclipse m2e 官方說明指出,它會在 IDE 中提供 Maven 建置、依據 pom.xml 管理 classpath、解析工作區模組依賴,以及建立 Maven 專案的精靈。

  • 電腦已安裝可用的 JDK,而不只是 JRE。
  • Eclipse 可在 File → New → Other… → Maven 看到 Maven Project 等精靈。
  • 可在 Window → Preferences → Maven → Installations 檢查 Eclipse 使用的 Maven。
  • 可在 Window → Preferences → Maven → User Settings 確認 settings.xml 與本機儲存庫位置。

如果 Maven 選單不存在,先確認目前 Eclipse 套件是否包含 m2e,再依 Eclipse m2e 官方頁面的安裝方式補上整合套件。

步驟一:建立父 Maven Project

1. 開啟 Maven Project 精靈

依序選擇 File → New → Other… → Maven → Maven Project。不同 Eclipse 版本的選單文字可能略有差異,但核心仍是 Maven Project 精靈。

Eclipse New Project 選擇 Maven Project
在 New Project 視窗選擇 Maven Project。

2. 建立簡單的 Maven 專案

勾選 Create a simple project (skip archetype selection),讓精靈直接建立基本 pom.xml。這個教學不依賴特定 archetype,因此跳過 archetype 比較容易看清楚父子 POM 關係。

Eclipse Maven Project 勾選 Create a simple project
勾選 Create a simple project。

3. 填寫 Maven 座標並選擇 pom packaging

  • Group Id:通常採反向網域命名,例如 com.examplecomorgidv 是命名慣例,不是 Maven 強制的組織類型限制。
  • Artifact Id:父專案名稱,例如 demo-parent
  • Version:可先使用 1.0.0-SNAPSHOT
  • Packaging:父專案選擇 pom,因為它的工作是聚合模組與提供共用設定,不產生 JAR 或 WAR。
Eclipse Maven Project 設定 Group Id Artifact Id 與 pom packaging
父專案的 Packaging 選擇 pom。

按下 Finish 後,父專案的核心是 pom.xml。若精靈產生空的 src 資料夾,可在確認沒有程式碼後移除;不要對已有內容的專案直接刪除來源目錄。

Eclipse 父 Maven 專案初始 src 與 pom.xml
父專案的初始結構。
Eclipse 父 Maven 專案保留 pom.xml
父專案只保留聚合與設定所需的 pom.xml。

4. 檢查父 POM

Apache Maven 官方文件把「聚合」與「繼承」分開說明:父 POM 以 <modules> 知道要建置哪些子目錄;子模組以 <parent> 繼承 groupId、version、dependencyManagement 或 pluginManagement。實務上常讓同一份父 POM 同時負責兩者。

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
         https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.example</groupId>
  <artifactId>demo-parent</artifactId>
  <version>1.0.0-SNAPSHOT</version>
  <packaging>pom</packaging>

  <modules>
    <module>demo-web</module>
    <module>demo-common</module>
  </modules>
</project>

可參考 Apache Maven:Introduction to the POM 的 Project Aggregation 與 Project Inheritance 章節。

步驟二:建立第一個 Maven Module

1. 從父專案新增 Maven Module

在剛建立的父專案上按右鍵,選擇 New → Other… → Maven → Maven Module。若右鍵選單沒有顯示,也可以從 File 選單開啟相同精靈。

Eclipse 建立 Maven Module 精靈
選擇 Maven Module。

在精靈中指定 Module Name,例如 demo-web,並確認 Parent Project 指向剛才的 demo-parent。同樣可勾選 Create a simple project,避免 archetype 帶入額外設定。

Eclipse Maven Module 設定名稱與父專案
設定模組名稱並選擇父專案。

2. 依部署方式選擇 jar 或 war

原流程把網站模組設為 war,這在傳統 Servlet/JSP 專案、需要部署到外部 Tomcat 等 Servlet 容器時仍適用。但多數 Spring Boot 應用使用可執行 jar;共用函式庫也應使用 jar。不要只因為模組提供 HTTP API 就一律選 war

Eclipse Maven Module 選擇 war packaging
傳統 Web 模組可選 war;其他情況依實際部署方式選擇。

建立完成後,Eclipse 會在父專案底下顯示模組。父 POM 通常會自動加入 <module>demo-web</module>,子模組 POM 也會包含父專案座標;仍建議手動檢查兩邊是否一致。

Eclipse 父專案下顯示 Maven Module
模組建立後位於父專案目錄下。

3. 檢查子模組的 parent

<parent>
  <groupId>com.example</groupId>
  <artifactId>demo-parent</artifactId>
  <version>1.0.0-SNAPSHOT</version>
  <relativePath>../pom.xml</relativePath>
</parent>

<artifactId>demo-web</artifactId>
<packaging>jar</packaging>

relativePath 是從子模組 POM 指向父 POM 的相對路徑。採用標準目錄結構時,預設的 ../pom.xml 通常即可。

步驟三:建立共用 JAR Module

若還需要放共用工具、DTO 或領域程式碼,可再次在父專案新增 Maven Module,例如 demo-common。操作方式與前一個模組相同,但 Packaging 選擇 jar

Eclipse 新增第二個 Maven Module
再次新增 Maven Module。
Eclipse Maven Module 選擇 jar packaging
共用模組使用 jar packaging。
Eclipse Maven 多模組專案最終結構
父專案下包含 Web 與共用工具模組。

讓 Web 模組使用共用模組

「放在同一個父專案底下」不代表程式碼可以自動互相引用。若 demo-web 要使用 demo-common,還要在 demo-web/pom.xml 加入依賴:

<dependency>
  <groupId>com.example</groupId>
  <artifactId>demo-common</artifactId>
  <version>${project.version}</version>
</dependency>

Apache Maven 的 reactor 會收集所有模組、依模組間的依賴排序,再按順序建置。因此即使父 POM 的 <modules> 順序不同,只要依賴關係正確,Maven 仍會先建置被依賴的模組。

在 Eclipse 更新並建置多模組專案

  1. 在父專案上按右鍵,選擇 Maven → Update Project…;常見快捷鍵為 Alt+F5
  2. 勾選父專案與所有模組,必要時勾選 Force Update,再按 OK。
  3. 在父專案上選擇 Run As → Maven build…,Goals 輸入 clean verify
  4. 也可在父專案目錄使用終端機執行 mvn clean verify

只想建置某個模組並自動帶上它依賴的工作區模組,可使用:

mvn -pl demo-web -am verify

-pl 選擇專案,-am(also-make)會一併建置它需要的 reactor 模組。更多行為可參考 Apache Maven:Guide to Working with Multiple Modules

常見問題與排查

父專案出現 src 資料夾,需要刪除嗎?

packaging=pom 的父專案通常不放 Java 原始碼。若 src 是精靈產生且確定為空,可以移除;若專案已有內容,先確認用途,不要直接刪除。

建立 Module 後,父 POM 沒有 modules

檢查父 POM 是否為 pom packaging,並加入與資料夾名稱一致的 <module>。路徑是相對於父 POM,不是 Java package 名稱。

子模組顯示 Missing artifact 或紅色錯誤

先檢查父座標、版本與 relativePath,再執行 Maven → Update Project。若模組彼此依賴,也要確認 dependency 的 groupId、artifactId、version 和實際模組一致。

網站模組一定要用 war 嗎?

不一定。傳統 Servlet/JSP 且部署到外部 Servlet 容器時常用 WAR;Spring Boot 等自帶伺服器的應用通常使用可執行 JAR。Packaging 應由部署方式決定。

aggregation 和 inheritance 有什麼不同?

Aggregation 是父 POM 的 <modules> 決定一起建置哪些專案;inheritance 是子 POM 的 <parent> 決定繼承哪些設定。兩者常放在同一份父 POM,但概念不同。

延伸閱讀

結論

Eclipse 建立 Maven 多模組專案的重點不是精靈本身,而是三個關係要一致:父專案使用 pom packaging、父 POM 的 <modules> 指向正確子目錄、子 POM 的 <parent> 與 dependency 使用正確座標。完成後從父專案執行 mvn clean verify,就能讓 Maven reactor 依依賴順序建置全部模組。

Similar Posts

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *