Maven 生命周期(Lifecycle)是其构建模型的核心机制,它将复杂的构建过程抽象为一系列有序、可扩展、可复用的阶段(Phases),并通过插件(Plugins)实现具体任务。理解 Maven 生命周期对掌握项目构建、定制化流程、故障排查至关重大。
一、Maven 生命周期概述
1.1 什么是生命周期?
- 生命周期(Lifecycle) 是一组预定义的阶段(Phases) 的有序集合。
- 每个阶段代表构建过程中的一个逻辑步骤(如编译、测试、打包等)。
- 执行某个阶段时,Maven 会自动按顺序执行该阶段之前的所有阶段。
- 生命周期本身不执行任何操作,而是通过绑定插件目标(Plugin Goals) 来完成实际工作。
1.2 三大标准生命周期
Maven 定义了三套相互独立的生命周期:
|
生命周期 |
用途 |
典型命令 |
|
default |
项目构建、打包、部署 |
mvn package , mvn install |
|
clean |
清理构建产物 |
mvn clean |
|
site |
生成项目文档站点 |
mvn site |
✅ 这三个生命周期彼此完全独立,互不影响。例如执行 mvn clean 不会触发 default 生命周期中的任何阶段。
二、Default 生命周期(主构建生命周期)
这是最核心、使用最频繁的生命周期,用于处理项目的编译、测试、打包、安装和部署。
2.1 阶段列表(按执行顺序)
|
阶段(Phase) |
描述 |
默认绑定的插件目标(Goal) |
|
validate |
验证项目是否正确且所有必要信息可用 |
无(一般用户自定义) |
|
initialize |
初始化构建状态,如设置属性、创建目录 |
无 |
|
generate-sources |
生成编译所需的源代码(如 Protocol Buffers、ANTLR 等) |
用户自定义 |
|
process-sources |
处理源代码(如过滤资源、编码转换) |
maven-resources-plugin:resources (部分) |
|
generate-resources |
生成打包所需的资源文件 |
用户自定义 |
|
process-resources |
将主资源文件复制并处理到输出目录(target/classes) |
maven-resources-plugin:resources |
|
compile |
编译项目的主源代码(src/main/java) |
maven-compiler-plugin:compile |
|
process-classes |
对编译后的 class 文件进行后处理(如字节码增强、混淆) |
用户自定义 |
|
generate-test-sources |
生成测试所需的源代码 |
用户自定义 |
|
process-test-sources |
处理测试源代码 |
无(默认不处理) |
|
generate-test-resources |
生成测试所需的资源 |
用户自定义 |
|
process-test-resources |
将测试资源复制到输出目录(target/test-classes) |
maven-resources-plugin:testResources |
|
test-compile |
编译测试代码(src/test/java) |
maven-compiler-plugin:testCompile |
|
test |
运行单元测试(使用 Surefire 插件) |
maven-surefire-plugin:test |
|
package |
将编译后的代码打包成分发格式(JAR/WAR/EAR 等) |
根据 <packaging> 类型绑定:• jar → maven-jar-plugin:jar• war → maven-war-plugin:war |
|
verify |
验证集成测试结果,检查包是否有效、符合质量标准 |
用户自定义(常用于集成测试后校验) |
|
install |
将包安装到本地 Maven 仓库(~/.m2/repository) |
maven-install-plugin:install |
|
deploy |
将最终构件部署到远程仓库(如 Nexus、Artifactory) |
maven-deploy-plugin:deploy |
注意:
并非所有阶段都有默认绑定的插件目标。
部分阶段(如 initialize, process-classes)一般由用户通过自定义插件绑定来扩展。
2.2 执行行为示例
mvn compile # 执行 validate → initialize → ... → compile
mvn test # 执行 validate → ... → test(包含 compile)
mvn package # 执行 validate → ... → package(包含 test)
mvn install # 执行全部 default 阶段直到 install
三、Clean 生命周期
用于清理上一次构建生成的文件(一般是 target/ 目录)。
3.1 阶段列表
|
阶段 |
描述 |
默认绑定插件目标 |
|
pre-clean |
清理前的准备工作 |
用户自定义 |
|
clean |
删除构建输出目录(默认为 target/) |
maven-clean-plugin:clean |
|
post-clean |
清理后的收尾工作 |
用户自定义 |
3.2 使用示例
mvn clean # 仅执行 clean 阶段(含 pre-clean → clean)
mvn clean install # 先 clean,再执行 default 生命周期到 install
maven-clean-plugin 默认删除 ${project.build.directory}(即 target)。
四、Site 生命周期
用于生成项目文档、报告和网站。
4.1 阶段列表
|
阶段 |
描述 |
默认绑定插件目标 |
|
pre-site |
生成站点前准备 |
用户自定义 |
|
site |
生成项目站点(含 Javadoc、测试报告、依赖图等) |
maven-site-plugin:site |
|
post-site |
站点生成后处理 |
用户自定义 |
|
site-deploy |
将站点部署到 Web 服务器 |
maven-site-plugin:deploy |
4.2 使用示例
mvn site # 生成站点到 target/site/
mvn site-deploy # 部署站点到配置的服务器
生成的站点位于 target/site/ 目录,可通过浏览器打开 index.html 查看。
五、生命周期与插件的绑定机制
5.1 插件目标(Goal) vs 阶段(Phase)
- 插件(Plugin):提供具体功能的模块(如编译、测试、打包)。
- 目标(Goal):插件提供的具体任务(如 compiler:compile)。
- 绑定(Binding):将某个 Goal 关联到特定 Phase。
5.2 默认绑定规则
Maven 根据项目的 <packaging> 类型(如 jar, war, pom)自动绑定不同的插件目标。
示例:<packaging>jar</packaging>的默认绑定
|
Phase |
Plugin:Goal |
|
process-resources |
maven-resources-plugin:resources |
|
compile |
maven-compiler-plugin:compile |
|
process-test-resources |
maven-resources-plugin:testResources |
|
test-compile |
maven-compiler-plugin:testCompile |
|
test |
maven-surefire-plugin:test |
|
package |
maven-jar-plugin:jar |
|
install |
maven-install-plugin:install |
|
deploy |
maven-deploy-plugin:deploy |
可通过命令查看默认绑定:
mvn help:describe -Dcmd=compile -Ddetail
5.3 自定义绑定(在 pom.xml中配置)
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<id>echo-message</id>
<phase>package</phase> <!-- 绑定到 package 阶段 -->
<goals>
<goal>run</goal>
</goals>
<configuration>
<target>
<echo message=" Package completed at ${maven.build.timestamp}!" />
</target>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
✅ 支持绑定多个 Goal 到同一 Phase,执行顺序由 pom.xml 中声明顺序决定。
六、生命周期执行流程图(简化版)
clean lifecycle default lifecycle site lifecycle
┌─────────────┐ ┌───────────────────────┐ ┌─────────────────┐
│ pre-clean │ │ validate │ │ pre-site │
│ clean │─────→ │ initialize │ ──→ │ site │
│ post-clean │ │ generate-sources │ │ post-site │
└─────────────┘ │ process-sources │ │ site-deploy │
│ ... │ └─────────────────┘
│ package │
│ verify │
│ install │
│ deploy │
└───────────────────────┘
⚠️ 实际执行中,三个生命周期不会自动串联,需显式调用(如 mvn clean install site)。
七、高级特性与最佳实践
7.1 跳过特定阶段
- 跳过测试:mvn install -DskipTests 或 -Dmaven.test.skip=true
- 离线模式:mvn –offline install
7.2 查看生命周期阶段
# 列出所有可用阶段(需安装 maven-help-plugin)
mvn help:describe -Dcmd=lifecycle
7.3 多模块项目中的生命周期
- 在聚合项目(<packaging>pom</packaging>)中,Maven 会递归执行所有子模块的对应生命周期阶段。
- 执行顺序受 <modules> 声明顺序和依赖关系影响(可通过 –also-make 等参数控制)。
7.4 自定义生命周期(不推荐)
虽然可通过 plexus 组件扩展生命周期,但官方不提议,应优先使用现有生命周期 + 自定义插件绑定。
八、常见问题解答(FAQ)
Q1:为什么执行 mvn test 会先编译代码?A:由于 test 阶段依赖于 test-compile,而 test-compile 又依赖于 compile,Maven 会自动执行前置阶段。
Q2:如何只执行某个插件目标而不触发整个生命周期?A:直接调用插件目标,如 mvn compiler:compile(仅编译,不执行 validate 等前置阶段)。
Q3:install 和 deploy 有什么区别?A:install 安装到本地仓库(供本机其他项目使用),deploy 上传到远程仓库(供团队共享)。
九、总结
|
特性 |
说明 |
|
结构化 |
三大生命周期,每个包含多个有序阶段 |
|
可扩展 |
通过插件绑定自定义行为 |
|
自动化 |
执行某阶段自动触发前置阶段 |
|
标准化 |
提供统一构建语义,降低项目差异 |
|
解耦 |
生命周期 ≠ 插件,职责分离 |
理解 Maven 生命周期,是高效使用 Maven、编写高质量 pom.xml、实现 CI/CD 自动化的基础。




