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