Maven項目中pom.xml父子模塊配置小結(jié)
在 Maven 項目中,pom.xml的父子模塊結(jié)構(gòu)是實現(xiàn)項目模塊化管理的核心機(jī)制,主要用于解決配置復(fù)用、版本統(tǒng)一、批量構(gòu)建等問題。下面從概念、配置、作用及示例等方面詳細(xì)講解:
一、核心概念:父 POM 與子 POM
- 父 POM(Parent POM):相當(dāng)于 "模板",定義了公共配置(如依賴版本、插件、屬性等),供子模塊繼承。
- 子 POM(Child POM):繼承父 POM 的配置,專注于自身模塊的特有配置(如模塊專屬依賴、資源等)。
父子關(guān)系本質(zhì)是繼承關(guān)系,同時父模塊通常還承擔(dān)聚合角色(通過modules標(biāo)簽管理子模塊,實現(xiàn)批量構(gòu)建)。
二、父 POM 的特點與配置
父 POM 的核心作用是抽取公共配置,避免子模塊重復(fù)編寫。其配置有以下特點:
1. 打包類型必須為pom
父模塊本身不生成代碼產(chǎn)物(如 JAR/WAR),僅用于管理,因此packaging標(biāo)簽必須設(shè)為pom:
<packaging>pom</packaging>
2. 定義公共配置(供子模塊繼承)
父 POM 中可定義的公共配置包括:
- properties:統(tǒng)一管理版本號、路徑等常量(子模塊可直接引用)。
- dependencyManagement:聲明依賴版本(子模塊引用時無需指定版本,統(tǒng)一由父模塊管控)。
- pluginManagement:聲明插件版本(類似依賴管理,子模塊引用插件時無需指定版本)。
- build:公共的構(gòu)建配置(如資源目錄、插件等,子模塊可繼承或覆蓋)。
3. 聚合子模塊(modules標(biāo)簽)
父模塊通過modules標(biāo)簽列出所有子模塊的相對路徑,實現(xiàn) "一鍵構(gòu)建所有子模塊"(聚合功能)。
例如,父模塊目錄下有user-service和order-service兩個子模塊:
<modules> <!-- 子模塊的相對路徑(指向子模塊目錄) --> <module>user-service</module> <module>order-service</module> </modules>
三、子 POM 的特點與配置
子模塊通過parent標(biāo)簽明確繼承的父模塊,從而復(fù)用父 POM 的配置。
1. 聲明父模塊(parent標(biāo)簽)
子 POM 必須通過parent標(biāo)簽指定父模塊的groupId、artifactId、version(這三者唯一標(biāo)識父模塊),示例:
<parent> <!-- 父模塊的坐標(biāo) --> <groupId>com.example</groupId> <artifactId>parent-project</artifactId> <version>1.0.0</version> <!-- 父POM的相對路徑(默認(rèn)../pom.xml,可省略) --> <relativePath>../pom.xml</relativePath> </parent>
relativePath:指定父 POM 的位置(默認(rèn)查找父目錄的pom.xml),若找不到則從 Maven 倉庫下載。
2. 子模塊的特有配置
子模塊可省略與父模塊相同的groupId和version(自動繼承),只需定義自身的artifactId和特有配置:
<!-- 繼承父模塊的groupId和version,可省略 -->
<artifactId>user-service</artifactId>
<packaging>jar</packaging> <!-- 子模塊通常為jar/war -->
<!-- 引用父模塊dependencyManagement中聲明的依賴(無需寫version) -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 版本由父模塊的dependencyManagement管控 -->
</dependency>
</dependencies>四、關(guān)鍵區(qū)別:繼承 vs 聚合
父子模塊中,繼承和聚合是兩個獨立但常結(jié)合使用的概念:
- 繼承:子模塊復(fù)用父模塊的配置(解決 "配置重復(fù)" 問題)。
- 聚合:父模塊通過
modules管理子模塊(解決 "批量構(gòu)建" 問題)。
一個父模塊可以只做聚合(不被繼承),也可以只被繼承(不做聚合),但實際開發(fā)中通常兩者結(jié)合(既當(dāng)父模塊又當(dāng)聚合模塊)。
五、完整示例
假設(shè)項目結(jié)構(gòu)如下:
parent-project/ # 父模塊目錄
├── pom.xml # 父POM
├── user-service/ # 子模塊1
│ └── pom.xml
└── order-service/ # 子模塊2
└── pom.xml父 POM(parent-project/pom.xml)
<?xml version="1.0" encoding="UTF-8"?>
<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- 父模塊坐標(biāo) -->
<groupId>com.example</groupId>
<artifactId>parent-project</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging> <!-- 父模塊必須為pom -->
<name>Parent Project</name>
<!-- 聚合子模塊 -->
<modules>
<module>user-service</module>
<module>order-service</module>
</modules>
<!-- 公共屬性(版本號等) -->
<properties>
<java.version>11</java.version>
<spring-boot.version>2.7.0</spring-boot.version>
</properties>
<!-- 依賴版本管理(子模塊引用時無需寫version) -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring-boot.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 公共插件配置 -->
<build>
<pluginManagement> <!-- 插件版本管理 -->
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>子 POM(user-service/pom.xml)
<?xml version="1.0" encoding="UTF-8"?>
<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- 繼承父模塊 -->
<parent>
<groupId>com.example</groupId>
<artifactId>parent-project</artifactId>
<version>1.0.0</version>
<relativePath>../pom.xml</relativePath> <!-- 父POM的位置 -->
</parent>
<!-- 子模塊自身坐標(biāo)(繼承了groupId和version,只需寫artifactId) -->
<artifactId>user-service</artifactId>
<name>User Service</name>
<!-- 引用父模塊管理的依賴(無需版本) -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 子模塊特有依賴 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version> <!-- 父模塊未管理,需顯式指定 -->
</dependency>
</dependencies>
<!-- 繼承父模塊的插件配置(也可覆蓋) -->
<build>
<plugins>
<!-- 引用父模塊pluginManagement中的插件(無需版本) -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>六、總結(jié)
父子 POM 結(jié)構(gòu)的核心價值在于:
- 配置復(fù)用:公共配置(版本、插件)集中在父 POM,減少重復(fù)代碼。
- 版本統(tǒng)一:通過
dependencyManagement和pluginManagement確保所有子模塊依賴版本一致,避免沖突。 - 批量操作:父模塊通過
modules聚合子模塊,支持 "一鍵構(gòu)建 / 打包所有子模塊"。
實際開發(fā)中,Spring Boot 的spring-boot-starter-parent就是典型的父 POM,通過繼承它可以快速獲得 Spring Boot 的默認(rèn)配置。
到此這篇關(guān)于Maven項目中pom.xml父子模塊配置小結(jié)的文章就介紹到這了,更多相關(guān)Maven pom.xml父子模塊配置內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java導(dǎo)出Excel(非模板)可導(dǎo)出多個sheet方式
Java開發(fā)中,導(dǎo)出Excel是常見需求,有時需要支持多個Sheet導(dǎo)出,此技巧介紹非模板方式實現(xiàn)單標(biāo)題單Sheet以及多Sheet導(dǎo)出,標(biāo)題一致或不一致均可,可換成Map使用,適合個人開發(fā)者和需要Excel導(dǎo)出功能的場景2024-09-09
Mabatis錯誤提示Parameter index out of range的處理方法
這篇文章主要介紹了Mabatis錯誤提示Parameter index out of range 的處理方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2018-08-08
springmvc接收json串,轉(zhuǎn)換為實體類List方法
今天小編就為大家分享一篇springmvc接收json串,轉(zhuǎn)換為實體類List方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08
Java實現(xiàn)上傳和下載功能(支持多個文件同時上傳)
這篇文章主要介紹了Java實現(xiàn)上傳和下載功能,支持多個文件同時上傳,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-12-12

