maven 插件执行的隐式 ID 是什么?

2022-09-04 01:57:50

要禁用父POM继承的插件执行,可以按如下方式覆盖它:

<execution>
    <id>TheNameOfTheRelevantExecution</id>
    <phase/>
</execution>

现在,如果父 POM 没有定义显式执行 ID,该怎么办?这个答案说:“如果你没有指定执行的id,Maven会隐式地做到这一点(以一种你直觉上没有预料到的方式)。那么,Maven 是如何生成执行 ID 的呢?链接相关 Maven 源代码的奖励积分。

注意:我不是在寻找禁用插件执行的替代方法。


答案 1

默认情况下,Maven 将创建一个执行 ID,根据不同的情况应用以下模式:

  • 执行 ID 设置为:对于从命令行执行的插件:目标default-cli
  • 执行 ID 设置为:对于插件:作为特定打包定义的绑定的一部分执行的目标default-<goal_name>
  • 执行 ID 设置为:对于插件:目标执行,作为 POM 的一部分,未指定任何 id。default

例如,如果您从命令行执行 Maven Dependency 插件,使用经典目标,您会注意到执行 id:mvn dependency:treedefault-cli

[INFO] --- maven-dependency-plugin:2.1:tree (default-cli) @ project ---

例如,如果您在编译阶段查看任何 Maven 构建版本的输出以及 Maven 编译器插件的默认执行,您会注意到 Maven 编译器插件的执行 ID 和目标。default-compiledefault-testCompilecompiletestCompile

相同的模式应用于 Maven 作为为给定打包定义的绑定的一部分执行的所有默认插件/目标。执行 ID 始终位于相关插件和目标名称之后的弯曲括号之间。
例如,基本 Maven 构建的摘录:

[INFO] --- maven-clean-plugin:2.5:clean (default-clean)
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) 
[INFO] --- maven-compiler-plugin:2.5.1:compile (default-compile) 
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) 
[INFO] --- maven-compiler-plugin:2.5.1:testCompile (default-testCompile) 
[INFO] --- maven-surefire-plugin:2.19:test (default-test)  

显示执行 ID(上面代码段中的最后一个标记,括号之间)如何始终遵循此模式。

最后,如果您在没有指定id的情况下配置POM中任何插件的执行,您会注意到Maven应用的id:default

[INFO] --- exec-maven-plugin:1.1:java (default) @ project ---

来自 Maven 官方文档

命令行执行 ID

直接从命令行调用的每个 mojo 都将分配有一个 default-cli 的执行 ID,这将允许使用此默认执行 Id 从 POM 配置该执行

默认绑定执行 ID

通过指定 POM 打包的默认生命周期映射绑定到构建生命周期的每个 mojo 都将为其分配一个默认目标名称的执行 ID

默认插件执行 ID

executionId 的默认值 ( 在 POM 模型中字面上设置为默认值 - 旨在提供一些此功能。不幸的是,该解决方案从未经过测试,以确保它与上述用例一起使用。它们在测试过程中从裂缝中掉了下来。现在,随着 Maven 2.2.0(以及更高版本的 Maven 3.0)的发布,这些用例终于可以得到解决。


最后但并非最不重要的一点是,关于执行ID,自Maven 3.3.1以来,您甚至可以使用new运算符从命令行指向POM的特定执行ID@executionId


答案 2

推荐