0%

maven生命周期

Maven 生命周期详解:从清理到部署的完整流程

Maven 的生命周期是其核心概念之一它定义了项目构建的标准化流程,从代码清理、编译、测试到打包、部署,每个环节都有明确的阶段和职责。理解生命周期有助于开发者掌握 Maven 构建的执行逻辑,高效管理项目流程。本文将系统解析 Maven 的三套套生命周期及其运作机制。

生命周期的本质

Maven 生命周期是一系列有序的阶段(Phase) 的集合,每个阶段代表构建过程中的一个特定步骤(如编译、测试)。其核心特点包括:

  • 抽象定义:生命周期仅定义 “做什么”(如 compile 表示编译源码),不关心 “怎么做”。
  • 插件实现:具体操作由插件的目标(Goal)完成,例如 compile 阶段由 maven-compiler-plugin:compile 目标执行。
  • 顺序执行:执行某个阶段时,Maven 会自动执行该阶段之前的所有阶段。例如执行 mvn package 会先执行 validatecompiletest 等前置阶段。

三套核心生命周期

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
2
mvn package  # 执行从 validate 到 package 的所有阶段
mvn install # 执行从 validate 到 install 的所有阶段(含 package)

Site 生命周期:生成项目站点

作用:生成项目文档站点(如 API 文档、测试报告、依赖分析),便于项目展示和维护。

包含四个阶段,执行顺序如下:

阶段 含义说明 绑定的默认插件目标
pre-site 生成站点前的准备工作(如收集文档)
site 生成站点文档(如 Javadoc、测试报告) maven-site-plugin:site
post-site 生成站点后的处理(如检查链接有效性)
site-deploy 将站点部署到服务器(如 Nginx、GitHub Pages) maven-site-plugin:site-deploy

示例

1
2
mvn site                # 生成站点文档(输出到 target/site)
mvn site-deploy # 生成并部署站点

生命周期与插件的绑定机制

生命周期的阶段需要与插件的目标(Goal)绑定才能完成实际工作。绑定方式分为内置绑定自定义绑定

内置绑定

Maven 为常用生命周期阶段预设了插件目标,无需手动配置即可使用。例如:

  • compile 阶段绑定 maven-compiler-plugin:compile(编译源码)。
  • test 阶段绑定 maven-surefire-plugin:test(执行单元测试)。
  • package 阶段绑定 maven-jar-plugin:jar(打包 Jar)。

这些绑定根据项目类型(如 jarwar)有所不同。例如,war 项目的 package 阶段绑定 maven-war-plugin:war

自定义绑定

当内置插件无法满足需求时,可将自定义插件目标绑定到生命周期阶段。

示例:将 Thrift 代码生成插件绑定到 generate-sources 阶段:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<plugin>
<groupId>org.apache.thrift.tools</groupId>
<artifactId>maven-thrift-plugin</artifactId>
<version>0.1.10</version>
<executions>
<execution>
<id>thrift-generate</id>
<phase>generate-sources</phase> <!-- 绑定到生成源码阶段 -->
<goals>
<goal>compile</goal> <!-- 执行插件的 compile 目标 -->
</goals>
</execution>
</executions>
</plugin>

执行 mvn generate-sources 时,会自动调用 Thrift 插件生成代码。

插件目标的默认阶段

部分插件目标有预设的默认绑定阶段,可省略 <phase> 配置。例如:

  • maven-thrift-plugin:compile 默认绑定到 generate-sources 阶段。
  • maven-surefire-plugin:test 默认绑定到 test 阶段。

可通过以下命令查看插件目标的默认阶段:

1
2
3
mvn help:describe -Dplugin=插件坐标 -Ddetail
# 示例:查看 surefire 插件详情
mvn help:describe -Dplugin=org.apache.maven.plugins:maven-surefire-plugin:2.22.2 -Ddetail

生命周期的执行规则

  1. 阶段顺序执行:执行某个阶段时,所有前置阶段会按顺序执行。例如 mvn install 会依次执行 validatecompiletestpackageinstall

  2. 多生命周期组合:可在一个命令中执行多个生命周期的阶段,按顺序执行。例如:

    1
    2
    # 先执行 clean 生命周期,再执行 default 生命周期的 package 阶段
    mvn clean package
  3. 直接执行插件目标:插件目标可独立于生命周期执行,无需绑定阶段。例如:

    1
    2
    # 执行依赖分析目标(无需经过生命周期阶段)
    mvn dependency:analyze
  4. 目标与阶段的混合执行:命令中可同时包含阶段和插件目标,按顺序执行。例如:

    1
    2
    # 执行 clean 阶段 → 复制依赖 → 执行 package 阶段
    mvn clean dependency:copy-dependencies package

实战示例:构建流程解析

mvn clean install 为例,完整执行流程如下:

  1. Clean 生命周期
    • pre-clean:准备清理(无操作)。
    • clean:删除 target 目录(maven-clean-plugin:clean)。
    • post-clean:清理后处理(无操作)。
  2. 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

欢迎关注我的其它发布渠道