Maven 生命周期详解:从清理到部署的完整流程
Maven 的生命周期是其核心概念之一它定义了项目构建的标准化流程,从代码清理、编译、测试到打包、部署,每个环节都有明确的阶段和职责。理解生命周期有助于开发者掌握 Maven 构建的执行逻辑,高效管理项目流程。本文将系统解析 Maven 的三套套生命周期及其运作机制。
生命周期的本质
Maven 生命周期是一系列有序的阶段(Phase) 的集合,每个阶段代表构建过程中的一个特定步骤(如编译、测试)。其核心特点包括:
- 抽象定义:生命周期仅定义 “做什么”(如
compile表示编译源码),不关心 “怎么做”。 - 插件实现:具体操作由插件的目标(Goal)完成,例如
compile阶段由maven-compiler-plugin:compile目标执行。 - 顺序执行:执行某个阶段时,Maven 会自动执行该阶段之前的所有阶段。例如执行
mvn package会先执行validate、compile、test等前置阶段。
三套核心生命周期
Maven 包含Clean、Default、Site 三套相互独立的生命周期,每套生命周期专注于不同的构建目标。
Clean 生命周期:清理项目
作用:删除上一次构建生成的文件(如 target 目录),为新构建做准备。
包含三个阶段,执行顺序如下:
| 阶段 | 含义 | 绑定的插件目标 |
|---|---|---|
pre-clean |
清理前的准备工作(如备份文件) | 无默认插件 |
clean |
删除构建目录(默认 target) |
maven-clean-plugin:clean |
post-clean |
清理后的收尾工作(如删除备份) | 无默认插件 |
示例:
1 | mvn clean # 执行 pre-clean → clean 阶段(post-clean 需手动绑定插件) |
Default 生命周期:构建项目(核心)
作用:完成项目的核心构建流程,从源码验证到部署,是最常用的生命周期。
包含 23 个阶段,按以下顺序执行(常用阶段加粗):
| 阶段 | 含义说明 | 绑定的默认插件目标 |
|---|---|---|
validate |
验证项目配置是否正确(如 POM 完整性、依赖是否存在) | 无 |
initialize |
初始化构建状态(如设置属性、创建目录) | 无 |
generate-sources |
生成源码(如通过工具自动生成的 Java 代码) | 无(需自定义绑定插件,如 Thrift 代码生成) |
process-sources |
处理源码(如过滤变量、编码转换) | maven-resources-plugin:resources |
generate-resources |
生成资源文件(如动态生成的配置文件) | 无 |
process-resources |
将资源文件复制到输出目录(默认 target/classes) |
maven-resources-plugin:resources |
compile |
编译源码为 class 文件 | maven-compiler-plugin:compile |
process-classes |
处理编译后的 class 文件(如字节码增强、混淆) | 无 |
generate-test-sources |
生成测试源码 | 无 |
process-test-sources |
处理测试源码 | maven-resources-plugin:testResources |
generate-test-resources |
生成测试资源文件 | 无 |
process-test-resources |
将测试资源复制到测试输出目录(target/test-classes) |
maven-resources-plugin:testResources |
test-compile |
编译测试源码 | maven-compiler-plugin:testCompile |
process-test-classes |
处理测试 class 文件 | 无 |
test |
执行单元测试(不影响构建结果) | maven-surefire-plugin:test |
prepare-package |
打包前的准备工作(如压缩、过滤) | 无 |
package |
将编译后的代码打包(如 Jar、War、Ear) | maven-jar-plugin:jar(Java 项目) |
pre-integration-test |
集成测试前准备(如启动服务器) | 无 |
integration-test |
执行集成测试(需打包后运行) | 无 |
post-integration-test |
集成测试后清理(如关闭服务器) | 无 |
verify |
验证包的有效性(如检查签名、测试覆盖率) | 无 |
install |
将包安装到本地仓库(供本地其他项目依赖) | maven-install-plugin:install |
deploy |
将包部署到远程仓库(供团队共享) | maven-deploy-plugin:deploy |
示例:
1 | mvn package # 执行从 validate 到 package 的所有阶段 |
Site 生命周期:生成项目站点
作用:生成项目文档站点(如 API 文档、测试报告、依赖分析),便于项目展示和维护。
包含四个阶段,执行顺序如下:
| 阶段 | 含义说明 | 绑定的默认插件目标 |
|---|---|---|
pre-site |
生成站点前的准备工作(如收集文档) | 无 |
site |
生成站点文档(如 Javadoc、测试报告) | maven-site-plugin:site |
post-site |
生成站点后的处理(如检查链接有效性) | 无 |
site-deploy |
将站点部署到服务器(如 Nginx、GitHub Pages) | maven-site-plugin:site-deploy |
示例:
1 | mvn site # 生成站点文档(输出到 target/site) |
生命周期与插件的绑定机制
生命周期的阶段需要与插件的目标(Goal)绑定才能完成实际工作。绑定方式分为内置绑定和自定义绑定。
内置绑定
Maven 为常用生命周期阶段预设了插件目标,无需手动配置即可使用。例如:
compile阶段绑定maven-compiler-plugin:compile(编译源码)。test阶段绑定maven-surefire-plugin:test(执行单元测试)。package阶段绑定maven-jar-plugin:jar(打包 Jar)。
这些绑定根据项目类型(如 jar、war)有所不同。例如,war 项目的 package 阶段绑定 maven-war-plugin:war。
自定义绑定
当内置插件无法满足需求时,可将自定义插件目标绑定到生命周期阶段。
示例:将 Thrift 代码生成插件绑定到 generate-sources 阶段:
1 | <plugin> |
执行 mvn generate-sources 时,会自动调用 Thrift 插件生成代码。
插件目标的默认阶段
部分插件目标有预设的默认绑定阶段,可省略 <phase> 配置。例如:
maven-thrift-plugin:compile默认绑定到generate-sources阶段。maven-surefire-plugin:test默认绑定到test阶段。
可通过以下命令查看插件目标的默认阶段:
1 | mvn help:describe -Dplugin=插件坐标 -Ddetail |
生命周期的执行规则
阶段顺序执行:执行某个阶段时,所有前置阶段会按顺序执行。例如
mvn install会依次执行validate→compile→test→package→install。多生命周期组合:可在一个命令中执行多个生命周期的阶段,按顺序执行。例如:
1
2# 先执行 clean 生命周期,再执行 default 生命周期的 package 阶段
mvn clean package直接执行插件目标:插件目标可独立于生命周期执行,无需绑定阶段。例如:
1
2# 执行依赖分析目标(无需经过生命周期阶段)
mvn dependency:analyze目标与阶段的混合执行:命令中可同时包含阶段和插件目标,按顺序执行。例如:
1
2# 执行 clean 阶段 → 复制依赖 → 执行 package 阶段
mvn clean dependency:copy-dependencies package
实战示例:构建流程解析
以 mvn clean install 为例,完整执行流程如下:
- Clean 生命周期:
pre-clean:准备清理(无操作)。clean:删除target目录(maven-clean-plugin:clean)。post-clean:清理后处理(无操作)。
- Default 生命周期:
validate:验证 POM 配置。process-resources:复制资源文件到target/classes。compile:编译源码到target/classes。process-test-resources:复制测试资源到target/test-classes。test-compile:编译测试源码到target/test-classes。test:执行单元测试(maven-surefire-plugin:test)。package:打包为 Jar 包(maven-jar-plugin:jar)。install:将 Jar 包安装到本地仓库(maven-install-plugin:install)