Maven插件goal是否必须配置在execution标签内才会执行?
核心结论
Maven插件的goal是否需要显式配置在<execution>标签内才会执行,和goal本身没有必然关系,核心判断依据是:该goal是否被当前项目的打包类型(<packaging>配置值)对应的默认构建生命周期绑定到了对应阶段。
针对maven-jar-plugin场景的具体解释
- 关于
jargoal:
当项目<packaging>值为jar(这也是Maven项目的默认配置值)时,Maven内置的生命周期规则已经默认把maven-jar-plugin:jar绑定到了构建流程的package阶段。只要构建执行到package阶段,这个goal就会自动触发,完全不需要额外写<execution>配置。 - 关于
test-jargoal:
这个goal属于插件提供的可选扩展功能,没有被任何内置打包类型的默认生命周期绑定,Maven不会主动触发它,必须通过<execution>标签显式声明要执行这个goal、以及它绑定的构建阶段,才会在对应阶段运行,标准配置如下:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.1.0</version> <executions> <execution> <phase>test-compile</phase> <goals> <goal>test-jar</goal> </goals> </execution> </executions> </plugin>
补充通用规则
- 不同打包类型的默认绑定规则完全不同:如果把项目
<packaging>改成pom,jargoal就不会自动执行,因为pom类型的构建流程默认没有绑定这个goal;如果是war类型的项目,默认绑定到package阶段的是maven-war-plugin:wargoal,不会触发jar插件的jar goal。 - 哪怕是已经被默认绑定的goal,也可以通过写
<execution>调整执行逻辑:比如修改绑定的phase、传入自定义参数、甚至配置多个execution让同一个goal在不同阶段多次执行,自定义配置会和默认绑定逻辑叠加生效,不会互相覆盖。 - 如果要禁用某个默认绑定的goal,可以匹配它的默认execution id(命名规则为
default-<goal名>,比如jar goal对应的默认id就是default-jar),在插件配置里把这个execution的phase设为none即可跳过默认执行。
内容的提问来源于stack exchange,提问作者askaquestion
相关产品推荐
相关产品推荐

