1. 概述
在本篇文章中,我们将深入探讨 Maven 的构建生命周期(Build Lifecycle)及其各个阶段(Phase),并分析 Goal 和 Phase 之间的关系。
对于经常使用 Maven 构建项目的 Java 开发者来说,理解这些概念不仅能提升构建效率,还能避免一些常见的“踩坑”情况。
2. Maven 构建生命周期
Maven 的构建过程遵循一套预定义的生命周期,用于项目部署、清理和文档生成等操作。
Maven 内置了三种主要的生命周期:
- ✅ default:主生命周期,负责项目编译、测试、打包、部署等核心流程
- ✅ clean:用于清理项目,删除上次构建生成的所有文件
- ✅ site:用于生成项目的站点文档(如报告、JavaDoc 等)
⚠️ 每个生命周期都由一系列有序的阶段(Phase)组成。
其中,default
生命周期包含 23 个阶段,是 Maven 最重要的构建流程;而 clean
和 site
生命周期分别包含 3 个和 4 个阶段,结构相对简单。
3. Maven 阶段(Phase)
Maven 阶段(Phase)是生命周期中的一个步骤,每个阶段都对应一个特定的任务。
以下是 default
生命周期中最常用的几个阶段:
validate
:验证项目是否完整,所有必要信息是否可用compile
:编译项目的源代码test-compile
:编译测试代码test
:使用单元测试框架执行测试package
:将编译后的代码打包成可分发格式(如 jar、war)integration-test
:处理并部署包以进行集成测试install
:将包安装到本地仓库deploy
:将包发布到远程仓库
📌 阶段是顺序执行的。
运行某个阶段时,Maven 会自动执行该阶段之前的所有阶段。
例如,执行以下命令:
mvn deploy
将会依次执行从 validate
到 deploy
的所有阶段,即整个 default
生命周期。
4. Maven 目标(Goal)
每个阶段由多个目标(Goal)组成,每个目标完成一项具体任务。
当我们执行某个阶段时,绑定到该阶段的所有目标都会按顺序执行。
以下是一些常见的阶段与默认绑定的 Goal:
compiler:compile
:绑定到compile
阶段,用于编译源代码compiler:testCompile
:绑定到test-compile
阶段surefire:test
:绑定到test
阶段,用于执行单元测试install:install
:绑定到install
阶段jar:jar
或war:war
:绑定到package
阶段,用于打包
🔧 可以使用如下命令查看某个阶段绑定的所有 Goal:
mvn help:describe -Dcmd=PHASENAME
例如,查看 compile
阶段绑定的 Goal:
mvn help:describe -Dcmd=compile
输出示例:
compile' is a phase corresponding to this plugin:
org.apache.maven.plugins:maven-compiler-plugin:3.1:compile
这说明 maven-compiler-plugin
的 compile
Goal 被绑定到了 compile
阶段。
5. Maven 插件(Plugin)
Maven 插件是一组 Goal 的集合,但这些 Goal 不一定都绑定到同一个阶段。
例如,下面是 Maven Failsafe 插件的配置,用于执行集成测试:
<build>
<plugins>
<plugin>
<artifactId>maven-failsafe-plugin</artifactId>
<version>${maven.failsafe.version}</version>
<executions>
<execution>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
该插件配置了两个主要 Goal:
integration-test
:运行集成测试verify
:验证集成测试是否通过
🔧 查看插件中所有 Goal 的命令:
mvn <PLUGIN>:help
例如:
mvn failsafe:help
输出示例:
This plugin has 3 goals:
failsafe:help
Display help information on maven-failsafe-plugin.
failsafe:integration-test
Run integration tests using Surefire.
failsafe:verify
Verify integration tests ran using Surefire.
🎯 执行某个插件的特定 Goal(跳过阶段):
mvn <PLUGIN>:<GOAL>
例如:
mvn failsafe:integration-test
6. 构建 Maven 项目
构建 Maven 项目的方式有多种,最常见的做法是执行生命周期中的某个阶段:
mvn deploy
这条命令会执行整个 default
生命周期。
也可以只执行到某个阶段,例如:
mvn install
通常在构建前我们会先清理项目:
mvn clean install
当然,也可以直接执行某个插件的 Goal:
mvn compiler:compile
⚠️ 注意: 如果没有指定任何 Phase 或 Goal,Maven 会报错:
[ERROR] No goals have been specified for this build. You must specify a valid lifecycle phase or a goal
7. 总结
本文详细介绍了 Maven 的三种生命周期、阶段(Phase)与目标(Goal)的关系,并通过实际命令和插件配置展示了如何使用它们。
✅ 理解这些概念,有助于我们更灵活地控制 Maven 构建流程,避免盲目执行整个生命周期,提升构建效率。