关于Maven生命周期阶段绑定自定义目标后执行顺序的技术问询
Maven生命周期阶段多目标绑定的执行顺序详解
这个问题我之前踩过坑,刚好可以给你讲明白~
首先直接给你核心结论:当多个目标绑定到同一个生命周期阶段时,执行顺序是先跑打包方式默认绑定的目标,再执行你在POM里手动配置的自定义目标,完全不是等整个生命周期(比如deploy阶段)结束才执行,而是在你绑定的那个阶段内部按顺序完成。
拿你举的例子来说:package阶段默认因为打包方式是jar,绑定了jar:jar目标。如果你把自定义插件的目标也绑定到package阶段,那当你执行mvn package时,流程是这样的:
- 先走完
package之前的所有前置生命周期阶段(比如compile、test这些) - 进入
package阶段后,先执行默认绑定的jar:jar,生成对应的jar包 - 紧接着就会执行你手动绑定的自定义目标
举个POM配置的例子更直观:
<build> <plugins> <!-- 自定义插件绑定到package阶段 --> <plugin> <groupId>com.example</groupId> <artifactId>my-custom-plugin</artifactId> <version>1.0.0</version> <executions> <execution> <phase>package</phase> <goals> <goal>my-custom-goal</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
运行mvn package时,你会在日志里看到jar:jar先执行,然后才是my-custom-plugin:my-custom-goal。
另外补充个小细节:如果同一个阶段绑定了多个自定义目标,它们的执行顺序就是你在POM里配置的先后顺序,谁写在前面谁先跑。
总结一下,你之前的预期(自定义目标在jar:jar之后立即运行)其实是对的,官方文档的描述就是这个意思——默认绑定的目标先执行,然后才是POM里配置的自定义目标,完全不会等到整个生命周期结束。
内容的提问来源于stack exchange,提问作者Ineversurrender93




