Maven Build 插件详解
本文档详细解释项目中所有 pom.xml 文件里 build 标签下配置的 Maven 插件的作用和用途。
插件概览
项目中各模块配置了不同的 Maven 插件,每个插件都有特定的作用。以下是详细说明:
1. 父 POM (pom.xml) - 全局插件配置
maven-compiler-plugin (第 315-325 行)
作用:编译 Java 源代码
- 版本:3.13.0
- 配置项:
source=17:源代码使用 JDK 17target=17:编译目标为 JDK 17encoding=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:打包格式为 JARclassifier=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 package或mvn 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 17target=${java.version}:Java 17compilerVersion=${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 的配置
插件使用总结
| 模块 | 配置的插件 | 说明 |
|---|---|---|
| 父 POM | maven-compiler-plugin maven-resources-plugin spring-boot-maven-plugin versions-maven-plugin | 全局配置,所有子模块继承 |
| app | maven-surefire-plugin spring-boot-maven-plugin | 启动模块,需要打包和测试 |
| api | maven-compiler-plugin | 覆盖编译配置(可移除,使用父 POM) |
| domain | maven-compiler-plugin | 覆盖编译配置(包含废弃配置) |
| trigger | maven-archetype-plugin | 项目模板生成(可选) |
| infrastructure | 无 | 使用父 POM 配置 ✅ |
| types | 无 | 使用父 POM 配置 ✅ |
常见 Maven 命令与插件的关系
| Maven 命令 | 使用的插件 | 说明 |
|---|---|---|
mvn clean | Maven 内置 | 清理输出目录(删除 target 文件夹) |
mvn compile | maven-compiler-plugin | 编译源代码 |
mvn test | maven-surefire-plugin | 运行单元测试 |
mvn package | spring-boot-maven-plugin | 打包应用(生成 JAR) |
mvn install | 所有插件 | 编译、测试、打包并安装到本地仓库 |
mvn deploy | 所有插件 | 编译、测试、打包并部署到远程仓库 |
mvn versions:display-dependency-updates | versions-maven-plugin | 检查依赖更新 |
mvn versions:display-plugin-updates | versions-maven-plugin | 检查插件更新 |
Maven 生命周期与插件
Maven 有三个标准的生命周期:
1. clean 生命周期
pre-clean→clean→post-clean- 清理项目
2. default 生命周期(最重要)
validate→compile→test→package→verify→install→deploy- 编译、测试、打包、安装、部署
3. site 生命周期
pre-site→site→post-site→site-deploy- 生成项目文档站点
插件执行顺序
当执行 mvn install 时,插件按以下顺序执行:
- maven-compiler-plugin:编译源代码
- maven-resources-plugin:处理资源文件
- maven-surefire-plugin:运行测试(如果配置)
- spring-boot-maven-plugin:打包应用(app 模块)
- 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. 统一性优化
- api 和 domain 模块的
maven-compiler-plugin配置可以移除 - 统一使用父 POM 的配置,减少重复
- 只在需要特殊配置时才覆盖父 POM 的配置
最佳实践
- 父 POM 统一管理:在父 POM 中定义所有插件的版本和通用配置
- 子模块最小配置:子模块只在需要特殊配置时才覆盖父 POM
- 显式指定版本:所有插件都应该显式指定版本号
- 避免重复配置:不要在不同模块中重复相同的配置
- 定期更新:使用
versions-maven-plugin定期检查依赖和插件更新