名称: maven-build-lifecycle 用户可调用: false 描述: 当处理Maven构建阶段、目标、配置文件或自定义Java项目的构建过程时使用。 允许工具: [读取, 写入, 编辑, Bash, Glob, Grep]
Maven 构建生命周期
掌握Maven的构建生命周期,包括阶段、目标、配置文件和构建自定义,以实现高效的Java项目构建。
概述
Maven的构建生命周期是一个定义良好的阶段序列,按顺序执行。理解生命周期对于有效的构建配置和优化至关重要。
默认生命周期阶段
完整阶段顺序
1. validate - 验证项目结构
2. initialize - 初始化构建状态
3. generate-sources
4. process-sources
5. generate-resources
6. process-resources - 复制资源到输出
7. compile - 编译源代码
8. process-classes
9. generate-test-sources
10. process-test-sources
11. generate-test-resources
12. process-test-resources
13. test-compile - 编译测试源
14. process-test-classes
15. test - 运行单元测试
16. prepare-package
17. package - 创建JAR/WAR
18. pre-integration-test
19. integration-test - 运行集成测试
20. post-integration-test
21. verify - 运行验证检查
22. install - 安装到本地仓库
23. deploy - 部署到远程仓库
常用阶段命令
# 仅编译
mvn compile
# 编译并运行测试
mvn test
# 创建包
mvn package
# 安装到本地仓库
mvn install
# 部署到远程仓库
mvn deploy
# 清理并构建
mvn clean install
# 跳过测试
mvn install -DskipTests
# 跳过测试编译和执行
mvn install -Dmaven.test.skip=true
清理生命周期
1. pre-clean
2. clean - 删除目标目录
3. post-clean
# 清理构建产物
mvn clean
# 清理特定目录
mvn clean -DbuildDirectory=out
站点生命周期
1. pre-site
2. site - 生成文档
3. post-site
4. site-deploy - 部署文档
# 生成站点
mvn site
# 生成并部署站点
mvn site-deploy
目标 vs 阶段
执行阶段
# 执行阶段(运行所有先前阶段)
mvn package
执行目标
# 执行特定目标
mvn compiler:compile
mvn surefire:test
mvn jar:jar
# 多个目标
mvn dependency:tree compiler:compile
阶段到目标绑定
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.12.1</version>
<executions>
<execution>
<id>compile-sources</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
构建配置文件
配置文件定义
<profiles>
<profile>
<id>development</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<env>dev</env>
<skip.integration.tests>true</skip.integration.tests>
</properties>
</profile>
<profile>
<id>production</id>
<properties>
<env>prod</env>
<skip.integration.tests>false</skip.integration.tests>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<debug>false</debug>
<optimize>true</optimize>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
配置文件激活
# 按名称激活
mvn install -Pproduction
# 多个配置文件
mvn install -Pproduction,ci
# 停用配置文件
mvn install -P!development
激活触发器
<profile>
<id>jdk17</id>
<activation>
<!-- 按JDK版本激活 -->
<jdk>17</jdk>
</activation>
</profile>
<profile>
<id>windows</id>
<activation>
<!-- 按操作系统激活 -->
<os>
<family>windows</family>
</os>
</activation>
</profile>
<profile>
<id>ci</id>
<activation>
<!-- 按环境变量激活 -->
<property>
<name>env.CI</name>
<value>true</value>
</property>
</activation>
</profile>
<profile>
<id>with-config</id>
<activation>
<!-- 按文件存在激活 -->
<file>
<exists>src/main/config/app.properties</exists>
</file>
</activation>
</profile>
资源过滤
启用过滤
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>false</filtering>
<excludes>
<exclude>**/*.properties</exclude>
<exclude>**/*.xml</exclude>
</excludes>
</resource>
</resources>
</build>
属性替换
# application.properties
app.name=${project.name}
app.version=${project.version}
app.environment=${env}
build.timestamp=${maven.build.timestamp}
构建自定义
源和目标配置
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<maven.compiler.release>17</maven.compiler.release>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
自定义源目录
<build>
<sourceDirectory>src/main/java</sourceDirectory>
<testSourceDirectory>src/test/java</testSourceDirectory>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
<testResources>
<testResource>
<directory>src/test/resources</directory>
</testResource>
</testResources>
</build>
最终名称和输出
<build>
<finalName>${project.artifactId}-${project.version}</finalName>
<directory>target</directory>
<outputDirectory>target/classes</outputDirectory>
<testOutputDirectory>target/test-classes</testOutputDirectory>
</build>
多模块构建
反应器选项
# 构建所有模块
mvn install
# 构建特定模块及其依赖
mvn install -pl module-name -am
# 构建模块的依赖项
mvn install -pl module-name -amd
# 从特定模块恢复
mvn install -rf :module-name
# 并行构建
mvn install -T 4
mvn install -T 1C # 每个CPU核心1个线程
模块顺序控制
<!-- 父级/pom.xml -->
<modules>
<module>common</module>
<module>api</module>
<module>service</module>
<module>web</module>
</modules>
测试配置
Surefire插件(单元测试)
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.2.3</version>
<configuration>
<includes>
<include>**/*Test.java</include>
<include>**/*Tests.java</include>
</includes>
<excludes>
<exclude>**/*IntegrationTest.java</exclude>
</excludes>
<parallel>methods</parallel>
<threadCount>4</threadCount>
<forkCount>1</forkCount>
<reuseForks>true</reuseForks>
</configuration>
</plugin>
Failsafe插件(集成测试)
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>3.2.3</version>
<executions>
<execution>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
</execution>
</executions>
<configuration>
<includes>
<include>**/*IT.java</include>
<include>**/*IntegrationTest.java</include>
</includes>
</configuration>
</plugin>
构建优化
增量构建
# 跳过未更改模块
mvn install -amd
# 使用构建缓存(需要Maven守护进程)
mvnd install
并行构建
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<fork>true</fork>
<compilerArgs>
<arg>-J-Xmx512m</arg>
</compilerArgs>
</configuration>
</plugin>
</plugins>
</build>
构建缓存
# 启用构建缓存(Maven 4+)
mvn install -Dmaven.build.cache.enabled=true
调试构建
详细输出
# 调试模式
mvn install -X
# 错误堆栈跟踪
mvn install -e
# 静默模式
mvn install -q
有效POM
# 查看解析后的POM
mvn help:effective-pom
# 查看有效设置
mvn help:effective-settings
# 活动配置文件
mvn help:active-profiles
依赖分析
# 检查插件版本
mvn versions:display-plugin-updates
# 检查依赖版本
mvn versions:display-dependency-updates
最佳实践
- 使用清理构建 - 发布前运行
mvn clean - 一致版本 - 锁定插件版本
- 配置文件隔离 - 保持配置文件专注
- 快速失败 - 在CI中使用
-ff快速反馈 - 并行构建 - 多模块项目使用
-T - 明智跳过 - 了解跳过选项的区别
- 资源过滤 - 仅在需要时启用
- 测试分离 - 单元测试在Surefire,集成测试在Failsafe
- 可重现构建 - 固定所有插件版本
- 文档化配置文件 - 注释配置文件目的
常见陷阱
- 跳过测试 - 不要在CI中跳过测试
- 发布中使用SNAPSHOT - 发布前移除快照
- 缺少清理 - 旧文件导致问题
- 配置文件冲突 - 重叠配置文件配置
- 资源过滤 - 意外过滤二进制文件
- 阶段混淆 - 运行错误阶段
- 内存问题 - 大型构建内存不足
- 反应器顺序 - 模块依赖问题
CI/CD集成
GitHub Actions
- name: 使用Maven构建
run: mvn -B clean verify -Pci
- name: 发布
run: mvn -B deploy -Prelease -DskipTests
Jenkins流水线
stage('构建') {
steps {
sh 'mvn -B clean package -DskipTests'
}
}
stage('测试') {
steps {
sh 'mvn -B test'
}
}
stage('集成测试') {
steps {
sh 'mvn -B verify -DskipUnitTests'
}
}
何时使用此技能
- 设置新的Maven项目
- 自定义构建阶段
- 为环境创建构建配置文件
- 配置测试执行
- 优化构建性能
- 调试构建失败
- 设置CI/CD流水线
- 多模块项目配置