Maven项目中pom.xml父子模块配置小结

 更新时间:2025年08月24日 10:35:14   作者:hqxstudying  
Maven父子模块结构通过pom.xml实现配置复用、版本统一和批量构建,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

在 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-serviceorder-service两个子模块:

<modules>
  <!-- 子模块的相对路径(指向子模块目录) -->
  <module>user-service</module>
  <module>order-service</module>
</modules>

三、子 POM 的特点与配置

子模块通过parent标签明确继承的父模块,从而复用父 POM 的配置。

1. 声明父模块(parent标签)

子 POM 必须通过parent标签指定父模块的groupIdartifactIdversion(这三者唯一标识父模块),示例:

<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. 子模块的特有配置

子模块可省略与父模块相同的groupIdversion(自动继承),只需定义自身的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 结构的核心价值在于:

  1. 配置复用:公共配置(版本、插件)集中在父 POM,减少重复代码。
  2. 版本统一:通过dependencyManagementpluginManagement确保所有子模块依赖版本一致,避免冲突。
  3. 批量操作:父模块通过modules聚合子模块,支持 "一键构建 / 打包所有子模块"。

实际开发中,Spring Boot 的spring-boot-starter-parent就是典型的父 POM,通过继承它可以快速获得 Spring Boot 的默认配置。

到此这篇关于Maven项目中pom.xml父子模块配置小结的文章就介绍到这了,更多相关Maven pom.xml父子模块配置内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java导出Excel(非模板)可导出多个sheet方式

    java导出Excel(非模板)可导出多个sheet方式

    Java开发中,导出Excel是常见需求,有时需要支持多个Sheet导出,此技巧介绍非模板方式实现单标题单Sheet以及多Sheet导出,标题一致或不一致均可,可换成Map使用,适合个人开发者和需要Excel导出功能的场景
    2024-09-09
  • Java中BigDecimal类的简单用法

    Java中BigDecimal类的简单用法

    这篇文章主要介绍了Java中BigDecimal类的简单用法,是Java应用程序开发中非常实用的技巧,本文以实例形式对此进行了简单的分析,需要的朋友可以参考下
    2014-09-09
  • 关于SHA算法原理与常用实现方式

    关于SHA算法原理与常用实现方式

    这篇文章主要介绍了关于SHA算法原理与常用实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • Java中的Future获取任务返回值详解

    Java中的Future获取任务返回值详解

    这篇文章主要介绍了Java中的Future获取任务返回值详解,在向线程池ThreadPoolExecutor提交任务时,一般为了方便操作采用execute提交任务,这时线程其实是无返回值的,需要的朋友可以参考下
    2023-12-12
  • Mabatis错误提示Parameter index out of range的处理方法

    Mabatis错误提示Parameter index out of range的处理方法

    这篇文章主要介绍了Mabatis错误提示Parameter index out of range 的处理方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-08-08
  • springmvc接收json串,转换为实体类List方法

    springmvc接收json串,转换为实体类List方法

    今天小编就为大家分享一篇springmvc接收json串,转换为实体类List方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-08-08
  • Mybatis拦截器实现公共字段填充的示例代码

    Mybatis拦截器实现公共字段填充的示例代码

    本文介绍了使用Spring Boot和MyBatis实现公共字段的自动填充功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-12-12
  • Token安全存储的几种方式小结

    Token安全存储的几种方式小结

    在现代 Web 应用中,身份认证与授权是确保系统安全性的重要部分,Token被广泛应用,作为实现身份认证的主要方式,然而,如何安全地存储这些 Token,是每个开发者在构建前端应用时必须考虑的问题,本文将深入探讨Token安全存储的几种方式,需要的朋友可以参考下
    2025-04-04
  • Java实现上传和下载功能(支持多个文件同时上传)

    Java实现上传和下载功能(支持多个文件同时上传)

    这篇文章主要介绍了Java实现上传和下载功能,支持多个文件同时上传,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • java Thumbnails 图片处理的使用

    java Thumbnails 图片处理的使用

    这篇文章主要介绍了java Thumbnails 图片处理的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03

最新评论