这个问题不能只针对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:没有定义执行目标
来自Build lifecycle basics:
插件目标表示有助于构建和管理项目的特定任务(比构建阶段更精细)。它可能绑定到零个或多个构建阶段。 未绑定到任何构建阶段的目标可以通过直接调用在构建生命周期之外执行。 (...) 此外,如果目标绑定到一个或多个构建阶段,则该目标将是在所有这些阶段中调用。
来自Guide to configuring plugins: Configuring build plugins:
但是如果目标没有绑定到任何生命周期阶段,那么它就不会在构建生命周期中执行。
从引用的内容可以得出结论,可以从命令行运行 id some-other-other-id 的执行,但事实并非如此,它永远无法运行 - 它将在第 5 个示例中介绍。
案例2:没有定义执行的id
goal 和 phase 在第一次执行中的定义足以让它运行,因此它得到 assigned a default execution id 的值 default 并被执行。
案例 3:没有定义执行阶段
由于没有在任何地方定义阶段,因此不会执行此执行。可以通过输出不包含带有其执行ID的行来验证。
案例 4:同时定义了 id 和 phase
此执行定义了所有三个:id、phase 和 goal,因此它会被执行。
案例 5:CLI 执行
如果你运行(阅读docck plugin documentation中的语法):
mvn docck:check -Doffline=true
它会输出:
[INFO] --- maven-docck-plugin:1.0:check (default-cli) @ MavenJavaApplication ---
来自Guide to configuring default mojo executions:
从 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 包装的空 pom。如果你运行:
mvn clean install
它也会触发compile 阶段,你会在输出中看到:
[INFO] --- maven-compiler-plugin:2.3.1:compile (default-compile) @ MavenJavaApplication ---
覆盖id标签的值,来自Guide to Configuring Default Mojo Executions:
同样,每个通过指定 POM 打包的默认生命周期映射绑定到构建生命周期的 mojo 都将分配一个 default- 的执行 ID,以允许独立配置每个默认 mojo 执行。
如果你运行mvn help:effective-pom,你会在输出中找到编译器插件的默认执行定义:
<execution>
<id>default-compile</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
它继承自 super POM 的 jar packaging 类型:
当没有声明打包时,Maven 假定工件是默认的:jar。有效类型是组件角色 org.apache.maven.lifecycle.mapping.LifecycleMapping 的 Plexus 角色提示(有关角色和角色提示的更多说明,请阅读 Plexus 上的更多内容)。目前的核心封装值为:pom、jar、maven-plugin、ejb、war、ear、rar、par。 这些定义了执行到特定包结构的每个相应构建生命周期阶段的默认目标列表。
换句话说,上述默认执行定义是compiler-plugin的默认生命周期映射(documentation,definition)的结果:
编译器插件有两个目标。两者都已绑定到 Maven 生命周期中的适当阶段,因此会在各自的阶段自动执行。
- compiler:compile 绑定到编译阶段,用于编译主要源文件。
执行 id 标签的唯一性
来自Guide to configuring plugins.html: Using the executions tag:
请注意,虽然执行 ID 在 POM 中单个插件的所有执行中必须是唯一的,但它们在 POM 的继承层次结构中不必是唯一的。来自不同 POM 的相同 id 的执行被合并。这同样适用于配置文件定义的执行。