1. 概述

在本篇文章中,我们将深入探讨 Maven 的构建生命周期(Build Lifecycle)及其各个阶段(Phase),并分析 GoalPhase 之间的关系。

对于经常使用 Maven 构建项目的 Java 开发者来说,理解这些概念不仅能提升构建效率,还能避免一些常见的“踩坑”情况。

2. Maven 构建生命周期

Maven 的构建过程遵循一套预定义的生命周期,用于项目部署、清理和文档生成等操作。

Maven 内置了三种主要的生命周期:

  • default:主生命周期,负责项目编译、测试、打包、部署等核心流程
  • clean:用于清理项目,删除上次构建生成的所有文件
  • site:用于生成项目的站点文档(如报告、JavaDoc 等)

⚠️ 每个生命周期都由一系列有序的阶段(Phase)组成。

其中,default 生命周期包含 23 个阶段,是 Maven 最重要的构建流程;而 cleansite 生命周期分别包含 3 个和 4 个阶段,结构相对简单。

3. Maven 阶段(Phase)

Maven 阶段(Phase)是生命周期中的一个步骤,每个阶段都对应一个特定的任务。

以下是 default 生命周期中最常用的几个阶段:

  • validate:验证项目是否完整,所有必要信息是否可用
  • compile:编译项目的源代码
  • test-compile:编译测试代码
  • test:使用单元测试框架执行测试
  • package:将编译后的代码打包成可分发格式(如 jar、war)
  • integration-test:处理并部署包以进行集成测试
  • install:将包安装到本地仓库
  • deploy:将包发布到远程仓库

📌 阶段是顺序执行的。
运行某个阶段时,Maven 会自动执行该阶段之前的所有阶段。

例如,执行以下命令:

mvn deploy

将会依次执行从 validatedeploy 的所有阶段,即整个 default 生命周期。

4. Maven 目标(Goal)

每个阶段由多个目标(Goal)组成,每个目标完成一项具体任务。

当我们执行某个阶段时,绑定到该阶段的所有目标都会按顺序执行。

以下是一些常见的阶段与默认绑定的 Goal:

  • compiler:compile:绑定到 compile 阶段,用于编译源代码
  • compiler:testCompile:绑定到 test-compile 阶段
  • surefire:test:绑定到 test 阶段,用于执行单元测试
  • install:install:绑定到 install 阶段
  • jar:jarwar: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-plugincompile 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 构建流程,避免盲目执行整个生命周期,提升构建效率。


原始标题:Maven Goals and Phases | Baeldung