Maven项目中pom.xml父子模块配置小结
作者:hqxstudying
在 Maven 项目中,pom.xml
的父子模块结构是实现项目模块化管理的核心机制,主要用于解决配置复用、版本统一、批量构建等问题。下面从概念、配置、作用及示例等方面详细讲解:
一、核心概念:父 POM 与子 POM
- 父 POM(Parent POM):相当于 "模板",定义了公共配置(如依赖版本、插件、属性等),供子模块继承。
- 子 POM(Child POM):继承父 POM 的配置,专注于自身模块的特有配置(如模块专属依赖、资源等)。
父子关系本质是继承关系,同时父模块通常还承担聚合角色(通过modules
标签管理子模块,实现批量构建)。
二、父 POM 的特点与配置
父 POM 的核心作用是抽取公共配置,避免子模块重复编写。其配置有以下特点:
1. 打包类型必须为pom
父模块本身不生成代码产物(如 JAR/WAR),仅用于管理,因此packaging
标签必须设为pom
:
<packaging>pom</packaging>
2. 定义公共配置(供子模块继承)
父 POM 中可定义的公共配置包括:
- properties:统一管理版本号、路径等常量(子模块可直接引用)。
- dependencyManagement:声明依赖版本(子模块引用时无需指定版本,统一由父模块管控)。
- pluginManagement:声明插件版本(类似依赖管理,子模块引用插件时无需指定版本)。
- build:公共的构建配置(如资源目录、插件等,子模块可继承或覆盖)。
3. 聚合子模块(modules标签)
父模块通过modules
标签列出所有子模块的相对路径,实现 "一键构建所有子模块"(聚合功能)。
例如,父模块目录下有user-service
和order-service
两个子模块:
<modules> <!-- 子模块的相对路径(指向子模块目录) --> <module>user-service</module> <module>order-service</module> </modules>
三、子 POM 的特点与配置
子模块通过parent
标签明确继承的父模块,从而复用父 POM 的配置。
1. 声明父模块(parent标签)
子 POM 必须通过parent
标签指定父模块的groupId
、artifactId
、version
(这三者唯一标识父模块),示例:
<parent> <!-- 父模块的坐标 --> <groupId>com.example</groupId> <artifactId>parent-project</artifactId> <version>1.0.0</version> <!-- 父POM的相对路径(默认../pom.xml,可省略) --> <relativePath>../pom.xml</relativePath> </parent>
relativePath
:指定父 POM 的位置(默认查找父目录的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>
四、关键区别:继承 vs 聚合
父子模块中,继承和聚合是两个独立但常结合使用的概念:
- 继承:子模块复用父模块的配置(解决 "配置重复" 问题)。
- 聚合:父模块通过
modules
管理子模块(解决 "批量构建" 问题)。
一个父模块可以只做聚合(不被继承),也可以只被继承(不做聚合),但实际开发中通常两者结合(既当父模块又当聚合模块)。
五、完整示例
假设项目结构如下:
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> <!-- 父模块坐标 --> <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> <!-- 子模块自身坐标(继承了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>
六、总结
父子 POM 结构的核心价值在于:
- 配置复用:公共配置(版本、插件)集中在父 POM,减少重复代码。
- 版本统一:通过
dependencyManagement
和pluginManagement
确保所有子模块依赖版本一致,避免冲突。 - 批量操作:父模块通过
modules
聚合子模块,支持 "一键构建 / 打包所有子模块"。
实际开发中,Spring Boot 的spring-boot-starter-parent
就是典型的父 POM,通过继承它可以快速获得 Spring Boot 的默认配置。
到此这篇关于Maven项目中pom.xml父子模块配置小结的文章就介绍到这了,更多相关Maven pom.xml父子模块配置内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!