这个问题不能id
只针对标签来处理,而是通过示例注意到它的不同值。这已经用 maven 3.0.5 进行了测试。考虑以下 pom 部分:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-docck-plugin</artifactId>
<version>1.0</version>
<executions>
<execution>
<id>some-other-other-id</id> <!-- No goal for execution is defined -->
<phase>pre-site</phase>
</execution>
<execution>
<phase>pre-site</phase> <!-- No id for execution is defined -->
<goals>
<goal>check</goal>
</goals>
</execution>
<execution>
<id>some-id</id> <!-- No phase for execution is defined -->
<goals>
<goal>check</goal>
</goals>
</execution>
<execution>
<id>some-other-id</id> <!-- Both id and phase defined -->
<phase>pre-site</phase>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
</plugin>
从命令行运行时mvn clean site
,它输出以下内容:
[INFO] --- maven-docck-plugin:1.0:check (default) @ MavenJavaApplication ---
[INFO] Skipping unsupported project: MavenJavaApplication
[INFO] No documentation errors were found.
[INFO]
[INFO] --- maven-docck-plugin:1.0:check (some-other-id) @ MavenJavaApplication ---
[INFO] Skipping unsupported project: MavenJavaApplication
[INFO] No documentation errors were found.
请注意,执行输出始终采用以下形式:
<plugin-name>:<plugin-version>:<phase> (<execution-id>)
案例1:没有定义执行目标
从构建生命周期基础知识:
插件目标代表了一个特定的任务(比构建阶段更精细),它有助于项目的构建和管理。它可能绑定到零个或多个构建阶段。未绑定到任何构建阶段的目标可以通过直接调用在构建生命周期之外执行。(...) 此外,如果一个目标绑定到一个或多个构建阶段,则该目标将在所有这些阶段中调用。
从指南到配置插件:配置构建插件:
但是如果目标没有绑定到任何生命周期阶段,那么它就不会在构建生命周期中执行。
从所引用的内容可以得出结论,some-other-other-id
可以从命令行运行带有 id 的执行,但事实并非如此,它永远无法运行——它将在第 5 个示例中进行介绍。
案例2:没有定义执行的id
goal
和 a在第一次执行中的定义phase
足以让它运行,因此它被分配了一个默认的执行 ID值default
并被执行。
案例 3:没有定义执行阶段
由于没有在任何地方定义阶段,因此不会执行此执行。可以通过输出不包含具有其执行 ID 的行这一事实来验证。
案例 4:同时定义了 id 和 phase
这个执行定义了所有三个: a id
, aphase
和 agoal
所以它被执行。
案例 5:CLI 执行
如果你运行(阅读docck 插件文档中的语法):
mvn docck:check -Doffline=true
它将输出:
[INFO] --- maven-docck-plugin:1.0:check (default-cli) @ MavenJavaApplication ---
从指南到配置默认 mojo 执行:
从 Maven 2.2.0 开始,每个直接从命令行调用的 mojo 都将分配一个 default-cli 的执行 ID,这将允许使用此默认执行 ID 从 POM 配置该执行
您可以通过三种不同的方式为从 CLI 执行的目标提供属性:
- 直接在命令行中
- 在插件配置中
id
在带有值的执行标签中default-cli
具体来说,上面的命令相当于运行
mvn docck:check
pom包含:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-docck-plugin</artifactId>
<version>1.0</version>
<configuration>
<offline>true</offline>
</configuration>
</plugin>
或者:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-docck-plugin</artifactId>
<version>1.0</version>
<executions>
<execution>
<id>default-cli</id>
<phase>pre-site</phase>
<goals>
<goal>check</goal>
</goals>
<configuration>
<offline>true</offline>
</configuration>
</execution>
</executions>
</plugin>
如果您想在不同的执行中保留一些通用属性的全局配置,但您想要从 CLI 运行的完整的其他属性集,那么最后一部分会派上用场。
案例6:默认执行
由于maven-docck-plugin
没有默认绑定,我将使用maven-compiler-plugin
. jar
考虑一个带包装的空绒球。如果你运行:
mvn clean install
它也会触发compile
阶段,您将在输出中看到:
[INFO] --- maven-compiler-plugin:2.3.1:compile (default-compile) @ MavenJavaApplication ---
要涵盖id
标签的值,请参阅配置默认 Mojo 执行指南:
同样,每个通过指定 POM 打包的默认生命周期映射绑定到构建生命周期的 mojo 都将分配一个 default-<goalName> 的执行 ID,以允许独立配置每个默认 mojo 执行。
如果您运行mvn help:effective-pom
,您将在输出中找到编译器插件的默认执行定义:
<execution>
<id>default-compile</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
它继承自super POM的jar
包装类型:
当没有声明打包时,Maven 假定工件是默认的:jar。有效类型是组件角色 org.apache.maven.lifecycle.mapping.LifecycleMapping 的 Plexus 角色提示(有关角色和角色提示的解释,请阅读 Plexus 的更多内容)。目前的核心封装值为:pom、jar、maven-plugin、ejb、war、ear、rar、par。这些定义了执行到特定包结构的每个相应构建生命周期阶段的默认目标列表。
换句话说,上面的默认执行定义是默认生命周期映射(文档,定义)的结果 compiler-plugin
:
编译器插件有两个目标。两者都已经绑定到 Maven 生命周期中的适当阶段,因此在各自的阶段自动执行。
- compiler:compile 绑定到 compile 阶段,用于编译主要的源文件。
执行 ID 标签的唯一性
从指南到配置 plugins.html:使用 executions 标签:
请注意,虽然执行 id 在 POM 中单个插件的所有执行中必须是唯一的,但它们在 POM 的继承层次结构中不必是唯一的。来自不同 POM 的相同 id 的执行被合并。这同样适用于配置文件定义的执行。