Skip to content

Maven Build 插件详解

本文档详细解释项目中所有 pom.xml 文件里 build 标签下配置的 Maven 插件的作用和用途。

插件概览

项目中各模块配置了不同的 Maven 插件,每个插件都有特定的作用。以下是详细说明:

1. 父 POM (pom.xml) - 全局插件配置

maven-compiler-plugin (第 315-325 行)

作用:编译 Java 源代码

  • 版本:3.13.0
  • 配置项
    • source=17:源代码使用 JDK 17
    • target=17:编译目标为 JDK 17
    • encoding=UTF-8:源代码文件编码
    • parameters=true:保留方法参数名(用于反射和调试)
  • 为什么需要:确保所有模块使用统一的编译配置
  • 使用场景:执行 mvn compile 时使用

maven-resources-plugin (第 326-333 行)

作用:处理资源文件(如配置文件、属性文件等)

  • 版本:3.3.1
  • 配置项
    • encoding=UTF-8:资源文件编码
  • 功能:将 src/main/resources 下的文件复制到输出目录
  • 为什么需要:确保资源文件正确编码和处理
  • 使用场景:编译时自动处理资源文件

spring-boot-maven-plugin (第 334-343 行)

作用:Spring Boot 应用打包插件

  • 版本:3.2.11(继承自 Spring Boot 版本)
  • 配置项
    • layers.enabled=true:启用分层打包(优化 Docker 镜像构建)
  • 功能
    • 将应用打包成可执行的 JAR 文件
    • 包含所有依赖(fat jar)
    • 支持 java -jar 直接运行
  • 为什么需要:父 POM 中配置,但实际只在 app 模块生效
  • 使用场景:执行 mvn package 时打包 Spring Boot 应用

versions-maven-plugin (第 344-348 行)

作用:管理依赖版本

  • 版本:2.17.1
  • 功能
    • 检查依赖是否有新版本:mvn versions:display-dependency-updates
    • 检查插件是否有新版本:mvn versions:display-plugin-updates
    • 更新版本号:mvn versions:set -DnewVersion=1.1.0
  • 为什么需要:帮助维护和升级依赖版本
  • 使用场景:定期检查依赖更新,升级项目版本

2. tour-mate-platform-app 模块

maven-surefire-plugin (第 146-156 行)

作用:运行单元测试

  • 版本:未指定(⚠️ 需要添加 ${maven-surefire-plugin.version}
  • 配置项
    • skipTests=true:跳过测试执行(构建时不运行测试)
    • testFailureIgnore=false:测试失败时不忽略(如果运行测试,失败会中断构建)
    • includes=**/*Test.java:只运行以 Test.java 结尾的测试类
  • 功能
    • mvn test 时执行测试
    • 生成测试报告(位于 target/surefire-reports
  • 为什么需要:app 模块有测试代码,需要测试插件
  • 使用场景
    • mvn test:运行测试
    • mvn test -DskipTests=false:强制运行测试(覆盖配置)

spring-boot-maven-plugin (第 157-173 行)

作用:打包 Spring Boot 应用

  • 版本:继承自父 POM
  • 配置项
    • mainClass=com.alisunxin.api.Application:指定主类(启动入口)
    • layout=JAR:打包格式为 JAR
    • classifier=exec:生成两个 JAR(普通 JAR 和可执行 JAR)
      • tour-mate-platform-app.jar:普通 JAR(不包含依赖)
      • tour-mate-platform-app-exec.jar:可执行 JAR(包含所有依赖)
  • 功能
    • 打包成可执行的 Spring Boot JAR
    • 包含所有依赖(fat jar)
    • 支持 java -jar tour-mate-platform-app-exec.jar 运行
  • 为什么需要:app 模块是启动模块,需要打包成可执行应用
  • 使用场景:执行 mvn packagemvn install 时打包应用

3. tour-mate-platform-api 模块

maven-compiler-plugin (第 25-32 行)

作用:编译 Java 源代码

  • 版本:继承自父 POM
  • 配置项
    • source=${java.version}:使用父 POM 定义的 Java 版本(17)
    • target=${java.version}:编译目标版本(17)
  • 为什么需要:确保 API 模块使用正确的 Java 版本编译
  • 注意:实际上可以移除,因为父 POM 已经配置了相同的设置

4. tour-mate-platform-domain 模块

maven-compiler-plugin (第 67-75 行)

作用:编译 Java 源代码

  • 版本:继承自父 POM
  • 配置项
    • source=${java.version}:Java 17
    • target=${java.version}:Java 17
    • compilerVersion=${java.version}:⚠️ 已废弃,可移除
  • 注意compilerVersion 在新版本 Maven 中已废弃,建议移除
  • 为什么需要:确保 Domain 模块使用正确的 Java 版本编译
  • 建议:可以移除,使用父 POM 的统一配置

5. tour-mate-platform-trigger 模块

maven-archetype-plugin (第 75-86 行)

作用:从现有项目生成 Maven 项目模板(Archetype)

  • 版本:3.2.0
  • 配置项
    • goal=create-from-project:从当前项目创建 Archetype
  • 功能
    • 生成项目模板,用于快速创建类似项目
    • 通常用于项目脚手架工具
  • 为什么需要:可能用于生成项目模板,但通常不是必需的
  • 使用场景
    • mvn archetype:create-from-project:生成项目模板
  • 建议:如果不需要生成项目模板,可以移除此插件

6. tour-mate-platform-infrastructure 模块

无插件配置

  • 继承父 POM 的插件配置
  • 使用默认的编译和打包行为
  • 这是最佳实践:只在需要特殊配置时才覆盖父 POM 的配置

7. tour-mate-platform-types 模块

无插件配置

  • 继承父 POM 的插件配置
  • 使用默认的编译和打包行为
  • 这是最佳实践:只在需要特殊配置时才覆盖父 POM 的配置

插件使用总结

模块配置的插件说明
父 POMmaven-compiler-plugin
maven-resources-plugin
spring-boot-maven-plugin
versions-maven-plugin
全局配置,所有子模块继承
appmaven-surefire-plugin
spring-boot-maven-plugin
启动模块,需要打包和测试
apimaven-compiler-plugin覆盖编译配置(可移除,使用父 POM)
domainmaven-compiler-plugin覆盖编译配置(包含废弃配置)
triggermaven-archetype-plugin项目模板生成(可选)
infrastructure使用父 POM 配置 ✅
types使用父 POM 配置 ✅

常见 Maven 命令与插件的关系

Maven 命令使用的插件说明
mvn cleanMaven 内置清理输出目录(删除 target 文件夹)
mvn compilemaven-compiler-plugin编译源代码
mvn testmaven-surefire-plugin运行单元测试
mvn packagespring-boot-maven-plugin打包应用(生成 JAR)
mvn install所有插件编译、测试、打包并安装到本地仓库
mvn deploy所有插件编译、测试、打包并部署到远程仓库
mvn versions:display-dependency-updatesversions-maven-plugin检查依赖更新
mvn versions:display-plugin-updatesversions-maven-plugin检查插件更新

Maven 生命周期与插件

Maven 有三个标准的生命周期:

1. clean 生命周期

  • pre-cleancleanpost-clean
  • 清理项目

2. default 生命周期(最重要)

  • validatecompiletestpackageverifyinstalldeploy
  • 编译、测试、打包、安装、部署

3. site 生命周期

  • pre-sitesitepost-sitesite-deploy
  • 生成项目文档站点

插件执行顺序

当执行 mvn install 时,插件按以下顺序执行:

  1. maven-compiler-plugin:编译源代码
  2. maven-resources-plugin:处理资源文件
  3. maven-surefire-plugin:运行测试(如果配置)
  4. spring-boot-maven-plugin:打包应用(app 模块)
  5. maven-install-plugin:安装到本地仓库

建议优化

1. app 模块 - 添加版本号

xml
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>${maven-surefire-plugin.version}</version>  <!-- 添加这一行 -->
    <configuration>
        <skipTests>true</skipTests>
        <testFailureIgnore>false</testFailureIgnore>
        <includes>
            <include>**/*Test.java</include>
        </includes>
    </configuration>
</plugin>

2. domain 模块 - 移除废弃配置

xml
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
        <source>${java.version}</source>
        <target>${java.version}</target>
        <!-- 移除 compilerVersion,已废弃 -->
    </configuration>
</plugin>

3. trigger 模块 - 移除不必要的插件(可选)

如果不需要生成项目模板,可以移除 maven-archetype-plugin

4. 统一性优化

  • apidomain 模块的 maven-compiler-plugin 配置可以移除
  • 统一使用父 POM 的配置,减少重复
  • 只在需要特殊配置时才覆盖父 POM 的配置

最佳实践

  1. 父 POM 统一管理:在父 POM 中定义所有插件的版本和通用配置
  2. 子模块最小配置:子模块只在需要特殊配置时才覆盖父 POM
  3. 显式指定版本:所有插件都应该显式指定版本号
  4. 避免重复配置:不要在不同模块中重复相同的配置
  5. 定期更新:使用 versions-maven-plugin 定期检查依赖和插件更新

参考资料

Powered by VitePress