Maven作为主流的项目构建工具,其核心能力之一是通过插件扩展构建流程,而插件的执行逻辑完全依赖pom.xml中plugin execution节点的phase和goal配置。理解这两个配置项的作用和关联,是自定义Maven构建流程的基础。

phase与goal的核心概念
phase:Maven生命周期的阶段
Maven定义了三套内置生命周期:clean、default、site,每套生命周期包含多个有序的phase。例如default生命周期包含validate、compile、test、package、install、deploy等阶段,阶段之间按顺序执行,后面的阶段会触发前面所有阶段的执行。
phase的作用是为插件执行指定触发时机,当Maven执行到某个phase时,所有绑定到该phase的插件目标都会被触发执行。
goal:插件的具体执行目标
goal是插件内部的具体功能单元,一个插件可以包含多个goal,每个goal对应一个独立的功能。例如maven-compiler-plugin插件包含compile(编译主代码)和testCompile(编译测试代码)两个goal,maven-surefire-plugin包含test(执行单元测试)goal。
goal是插件执行的最小单位,必须明确指定才能让插件完成对应的功能。
phase与goal的绑定规则
在plugin execution配置中,phase和goal的绑定遵循以下规则:
- 一个execution可以绑定一个phase,同时配置多个goal,多个goal会在该phase触发时按顺序执行
- 如果插件官方文档中某个goal有默认绑定的phase,配置时可以省略phase,Maven会自动使用默认绑定
- 同一个phase可以绑定多个不同插件的goal,执行顺序和配置顺序一致
- 可以通过<executions>标签配置多个execution,让同一个插件的多个goal绑定到不同的phase
配置示例
基础配置示例
以下是一个将maven-compiler-plugin的compile goal绑定到compile phase的配置,这个配置其实是maven-compiler-plugin的默认配置,即使不写也会生效:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<executions>
<execution>
<id>default-compile</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
自定义phase绑定示例
假设我们需要在打包前生成一个版本信息文件,可以使用maven-antrun-plugin的run goal,将其绑定到package phase之前validate之后的generate-resources phase:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.8</version>
<executions>
<execution>
<id>generate-version-file</id>
<phase>generate-resources</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<target>
<echo file="${project.build.outputDirectory}/version.txt">
项目版本:${project.version}
构建时间:${maven.build.timestamp}
</echo>
</target>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
多goal绑定示例
以下配置将maven-surefire-plugin的两个goal绑定到test phase,同时执行单元测试和集成测试:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M7</version>
<executions>
<execution>
<id>unit-test</id>
<phase>test</phase>
<goals>
<goal>test</goal>
</goals>
<configuration>
<includes>
<include>**/*Test.java</include>
</includes>
</configuration>
</execution>
<execution>
<id>integration-test</id>
<phase>test</phase>
<goals>
<goal>test</goal>
</goals>
<configuration>
<includes>
<include>**/*IT.java</include>
</includes>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
常见配置问题排查
- 插件没有执行:检查phase是否属于当前执行的生命周期,例如执行mvn clean时不会触发default生命周期的phase,绑定到default生命周期phase的插件不会执行
- goal执行顺序不符合预期:同一个phase下的goal执行顺序和<executions>配置顺序一致,调整配置顺序即可
- goal找不到:检查插件的版本是否正确,不同版本的插件goal可能有差异,参考对应版本的官方文档
- 配置不生效:检查<executions>标签是否嵌套正确,configuration配置是否在对应的execution内部,全局configuration和execution内的configuration作用范围不同
Mavenpom.xmlplugin_executionphasegoal修改时间:2026-07-20 06:15:16