执行时机由phase决定,goal仅指定具体任务;未配置phase则插件不会自动触发,即使goal正确也无法执行。

plugin execution 的 phase 和 goal 到底谁决定执行时机
执行时机由 phase 决定,goal 是具体干啥;没配 phase,插件压根不会自动触发——哪怕 goal 写得再全也没用。
常见错误是只写 <goals><goal>compile</goal></goals>,漏掉 <phase>,结果 mvn compile 时该插件完全不运行。Maven 的生命周期阶段(如 compile、package)才是调度入口,goal 只是挂载在那个点上的具体任务。
-
phase必须是标准生命周期阶段名(如generate-sources、process-resources),拼错或自定义名称会导致静默忽略 - 同一个
phase下可绑定多个goal,执行顺序按pom.xml中声明顺序,不是按字母或插件名 - 若插件本身默认绑定了
goal(如maven-compiler-plugin默认把compile绑到compile阶段),显式配置<execution>会覆盖默认行为,不是叠加
为什么 mvn clean install 里我的 execution 没跑
最常见原因是:你配的 phase 不在 clean 或 install 覆盖的阶段链里。比如配了 <phase>pre-integration-test</phase>,但命令没走到集成测试环节(默认跳过),或者压根没触发 integration-test 阶段。
验证方法:加 -X 运行,搜 Executing: 或 Bound to phase:,看目标 goal 是否出现在日志中;更直接的是用 mvn help:describe -Dplugin=xxx -Ddetail 查插件默认绑定关系。
- 执行
mvn install时,只会触发validate→compile→package→install链上已绑定的 goals,不会自动补全中间缺失阶段 - 如果
phase配的是deploy,但命令只到install,那它就不执行——别指望 Maven “顺手帮你多跑一程” - 某些插件(如
maven-antrun-plugin)必须显式配phase,它自身无默认绑定,不配就等于没写
execution 中 goal 写错会怎样
Goal 名写错,Maven 启动时就报错:Plugin 'xxx' has no goal named 'yyy',不会等到执行阶段才失败。
注意大小写和连字符:比如 maven-surefire-plugin 的 goal 是 test,不是 surefire:test(后者是插件坐标写法);exec-maven-plugin 的 goal 是 exec,不是 java 或 run。
- Goal 名来自插件的 Mojo 类名(去掉
Mojo后缀并转为小写+连字符),不是配置文件里的标签名 - 有些插件提供多个 goal(如
maven-dependency-plugin有copy、unpack、tree),混用会导致行为完全不符预期 - 使用
mvn xxx:yyy直接调用时,xxx是插件前缀(dependency),yyy是 goal(tree),这个映射关系和<goal>里写的必须一致
多个 execution 共存时 phase 冲突怎么处理
同个 phase 下多个 execution 会按 pom.xml 中出现顺序依次执行,没有优先级或覆盖逻辑——除非它们属于同一插件且 ID 相同,此时后声明的会覆盖前声明的。
容易被忽略的是:不同插件绑到同一 phase,执行顺序只由插件声明顺序决定,跟 <execution> 块位置无关。比如 maven-resources-plugin 在前、maven-compiler-plugin 在后,即使后者 execution 块写在前面,资源复制也一定先于编译。
- 想严格控制顺序?只能把它们拆到不同
phase,比如用process-resources和compile,而不是都塞进compile - 避免用
id为default的 execution,因为很多插件自带 default,容易意外覆盖 - 如果两个 execution 都改同一类输出(比如都往
target/classes写东西),要考虑是否真需要并行,还是该合并逻辑







