插件目标绑定机制
插件目标可绑定到生命周期阶段,阶段触发时执行目标。
绑定概念
Phase 与 Goal
XML
生命周期阶段 (Phase)
↓ 绑定
插件目标 (Goal)
示例:
package 阶段 → jar:jar
默认绑定
default 生命周期默认绑定
| 阶段 | 插件:目标 |
|---|---|
| process-resources | resources:resources |
| compile | compiler:compile |
| process-test-resources | resources:testResources |
| test-compile | compiler:testCompile |
| test | surefire:test |
| package | jar:jar / war:war |
| install | install:install |
| deploy | deploy:deploy |
packaging 决定绑定
| packaging | package 阶段绑定 |
|---|---|
| jar | jar:jar |
| war | war:war |
| maven-plugin | plugin:addPluginArtifactMetadata |
自定义绑定
基本语法
XML
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.2.1</version>
<executions>
<execution>
<id>attach-source</id>
<phase>package</phase> <!-- 绑定到 package 阶段 -->
<goals>
<goal>jar</goal> <!-- 执行的目标 -->
</goals>
</execution>
</executions>
</plugin>
绑定元素
| 元素 | 说明 |
|---|---|
| phase | 生命周期阶段 |
| goals | 目标列表 |
非默认阶段绑定
绑定到非默认阶段
XML
<!-- 在 verify 阶段执行打包 -->
<execution>
<phase>verify</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
绑定到 initialize 阶段
XML
<!-- 项目初始化时执行 -->
<execution>
<phase>initialize</phase>
<goals>
<goal>exec</goal>
</goals>
</execution>
多目标绑定
多个目标同一阶段
XML
<execution>
<phase>package</phase>
<goals>
<goal>jar</goal>
<goal>test-jar</goal>
</goals>
</execution>
不同阶段不同目标
XML
<executions>
<execution>
<id>compile-hook</id>
<phase>compile</phase>
<goals>
<goal>run</goal>
</goals>
</execution>
<execution>
<id>package-hook</id>
<phase>package</phase>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
绑定顺序
同阶段多插件
Bash
<!-- package 阶段绑定 -->
<plugins>
<!-- 1. jar 插件 -->
<plugin>
<artifactId>maven-jar-plugin</artifactId>
</plugin>
<!-- 2. source 插件 -->
<plugin>
<artifactId>maven-source-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
执行顺序:jar:jar → source:jar
阶段触发目标执行
触发链
Bash
执行 mvn package:
validate
↓
compile(触发 compiler:compile)
↓
test(触发 surefire:test)
↓
package(触发 jar:jar, source:jar)
↓
完成后
查看绑定
使用 help:describe
XML
mvn help:describe -Dcmd=package
输出:
Bash
package' is a phase corresponding to this plugin:
maven-jar-plugin:jar
查看插件目标绑定
XML
mvn help:describe -Dplugin=maven-jar-plugin -Ddetail
无阶段绑定
直接执行目标
text
<!-- 不绑定阶段,需手动执行 -->
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-deps</id>
<goals>
<goal>copy-dependencies</goal>
</goals>
<!-- 无 phase,手动执行 -->
</execution>
</executions>
</plugin>
手动执行:
text
mvn dependency:copy-dependencies@copy-deps
前置/后置阶段
pre/post 阶段
text
<!-- pre-clean 阶段执行 -->
<execution>
<phase>pre-clean</phase>
<goals>
<goal>run</goal>
</goals>
</execution>
<!-- post-package 自定义(不存在) -->
<!-- 只能绑定到现有阶段 -->
目标绑定最佳实践
推荐做法
| 做法 | 说明 |
|---|---|
| 遵循默认绑定 | 不重复绑定内置目标 |
| 合理选择阶段 | 目标性质匹配阶段 |
| 明确 id | 便于调用和调试 |
常见自定义绑定
| 目标 | 推荐阶段 |
|---|---|
| source:jar | package |
| javadoc:jar | package |
| dependency:copy-dependencies | package |
| exec:exec | initialize |
要点总结
- phase-goal 绑定决定阶段触发目标
- packaging 决定默认绑定
- executions 自定义绑定
- phase 指定绑定阶段
- goals 指定执行目标
- 同阶段多目标按声明顺序执行
- 无 phase 需手动执行
📝 发现内容有误?点击此处直接编辑