Maven 生命周期详解

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 自动化的基础。

© 版权声明

相关文章

暂无评论

none
暂无评论...