maven 插件执行的隐式 ID 是啥?

Posted

技术标签:

【中文标题】maven 插件执行的隐式 ID 是啥?【英文标题】:What is the implicit ID of a maven plugin execution?maven 插件执行的隐式 ID 是什么? 【发布时间】:2016-04-08 00:35:13 【问题描述】:

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

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

如果父 POM 没有明确定义执行 ID 怎么办? This answer 说“如果你没有指定 id 来执行,Maven 会隐式地执行它(以一种你不期望的方式)。”那么 Maven 是如何生成执行 ID 的呢?链接相关 Maven 源代码的奖励积分。

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

【问题讨论】:

【参考方案1】:

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

执行 id 设置为:default-cli for plugin:goals 从命令行执行 执行 id 设置为:default-&lt;goal_name&gt; for plugin:goals 作为特定包装定义的 binding 的一部分执行 执行 id 设置为:default 用于 plugin:goals 执行,作为 POM 的一部分,但未指定任何 id。

如果您从命令行执行Maven Dependency Plugin,例如,使用经典的mvn dependency:tree 目标,您会注意到default-cli 执行ID:

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

例如,如果您在编译阶段查看任何 Maven 构建的输出和Maven Compiler Plugin 的默认执行,您会注意到default-compiledefault-testCompile 作为compile 的执行ID 和testCompile Maven 编译器插件的目标。

相同的模式适用于 Maven 执行的所有默认插件/目标,作为为给定包装定义的 binding 的一部分。执行 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(上面 sn-p 中的最后一个标记,在括号之间)如何始终遵循此模式。

最后,如果你在 POM 中配置任何插件的执行而不指定 id,你会注意到 Maven 应用的 default id:

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

来自official Maven documentation:

命令行执行id

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

默认绑定执行ID

每个通过指定 POM 打包的默认生命周期映射绑定到构建生命周期的 mojo 都将分配一个 default-goalName 的执行 ID

默认插件执行 ID

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


最后但同样重要的是,关于执行 ID,因为 Maven 3.3.1 您甚至可以使用新的 @executionId 运算符指向 POM from the command line 的特定执行 ID

【讨论】:

以上是关于maven 插件执行的隐式 ID 是啥?的主要内容,如果未能解决你的问题,请参考以下文章

为啥Java在使用“加号”运算符时会执行从双精度到整数的隐式类型转换? [复制]

函数的隐式声明是啥意思?

在构造 std::variant 时禁用从指针类型到 bool 的隐式转换的最佳方法是啥?

vb.net2010中的隐式声明和显示声明分别是啥

Maven的Pom文件中的隐式依赖导致Jar包冲突的问题

谁能解释一下maven build、mavenclean 这些都是啥作用,都是啥时候用