我正在查看正在检查的pom的插件部分,并发现了这个:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-docck-plugin</artifactId>
<version>1.0</version>
<executions>
<execution>
<phase>pre-site</phase>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
</plugin>
如果您观察执行部分,您会注意到它没有id标记。我的问题是Maven如何使用id标签以及缺少一个标签如何影响观察到的行为。我查看了Maven教程并且可以推断出不同执行阶段的id必须是唯一的,不一定是在继承的poms中,但它没有提到它是如何被利用的。
答案 0 :(得分:7)
至少对于Maven 3.0.x,未指定时,执行的ID为default- goalName 。因此,对于您拥有的示例,ID将为default-check
。值default-cli
也可用于配置命令行执行。
从POM本身,任何父POM(包括Maven super POM)和settings.xml创建有效POM时,将使用执行ID。 Maven合并了这些POM中具有相同ID的插件执行配置。这是一个例子。假设这个插件配置在父POM中(只有Maven超级POM在层次结构中更高。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<executions>
<!-- default-jar is the ID assigned to the jar:jar execution
included automatically by Maven. This demonstrates how we
can tweak the built-in plugin executions to meet our needs.
Note we do not have to specify phase or goals, as those are
inherited. In the example we add a configuration block and
change the values of the <forceCreation> and <finalName>
elements. -->
<execution>
<id>default-jar</id>
<configuration>
<finalName>firstJar</finalName>
<forceCreation>true</forceCreation>
</configuration>
</execution>
<!-- Add an execution of the jar plugin to build a jar with the
same contents but different name. We assign an execution ID.
Because we are not inheriting config for this execution it's our
responsibility to specify phase and goals, as well as the config
we want. Executions are run in order so this one will run after
the default. -->
<execution>
<id>another-jar</id>
<phase>package</phase>
<goals>
<goal>jar</goal>
</goals>
<configuration>
<finalName>duplicateJar</finalName>
</configuration>
</execution>
<!-- Configure plugin behavior if we execute the jar:jar goal
directly from the command line. Don't bind this to a phase;
we don't want to run this as part of the normal lifecycle. -->
<execution>
<id>default-cli</id>
<configuration>
<finalName>cmdLineJar</finalName>
</configuration>
</execution>
</executions>
</plugin>
使用上面的配置:
答案 1 :(得分:3)
问题不能仅针对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>)
插件目标代表一个特定任务(比构建阶段更精细),它有助于构建和管理项目。它可能绑定到零个或多个构建阶段。 未绑定到任何构建阶段的目标可以通过直接调用在构建生命周期之外执行。(...)此外,如果目标绑定到一个或多个构建阶段,那么该目标将是在所有这些阶段都要求。
来自Guide to configuring plugins: Configuring build plugins:
但是如果目标不受任何生命周期阶段的约束,那么它就不会在构建生命周期中被执行。
从引用的内容可以得出结论,id some-other-other-id
的执行可以从命令行运行,但事实并非如此,它永远不能运行 - 它将在第5个例子中介绍
第一次执行中goal
和phase
的定义足以使其运行,因此它获得值default
assigned a default execution id并执行。< / p>
由于阶段未定义任何地方,因此执行不会执行。可以通过输出不包含具有执行ID的行来验证它。
此执行定义所有三个:id
,phase
和goal
,以便执行。
如果您运行(阅读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运行。
由于maven-docck-plugin
没有默认绑定,我会用maven-compiler-plugin
覆盖它。考虑一个带有jar
包装的空pom。如果您运行:
mvn clean install
它也将触发compile
阶段,您将在输出中看到:
[INFO] --- maven-compiler-plugin:2.3.1:compile (default-compile) @ MavenJavaApplication ---
从Guide to Configuring Default Mojo Executions
中覆盖id
代码的值
同样,通过指定POM包装的默认生命周期映射绑定到构建生命周期的每个mojo将具有default-&lt; goalName&gt;的执行ID。分配给它,允许独立配置每个默认mojo执行。
如果运行mvn help:effective-pom
,您将在输出中找到编译器插件的默认执行定义:
<execution>
<id>default-compile</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
它从[{1}} super POM类型继承自packaging:
当没有声明包装时,Maven认为工件是默认的:jar。有效类型是组件角色org.apache.maven.lifecycle.mapping.LifecycleMapping的Plexus角色提示(有关Plexus的更多信息,请参阅角色和角色提示的说明)。目前的核心包装价值是:pom,jar,maven-plugin,ejb,war,ear,rar,par。 这些定义了针对特定包结构执行到每个相应构建生命周期阶段的默认目标列表。
换句话说,上面的默认执行定义是jar
的默认生命周期映射(documentation,definition)的结果:
编译器插件有两个目标。两者都已经绑定到Maven生命周期中的适当阶段,因此会在各自的阶段自动执行。
- 编译器:compile绑定到编译阶段,用于编译主源文件。
来自Guide to configuring plugins.html: Using the executions tag:
请注意,虽然执行ID必须在POM中单个插件的所有执行中都是唯一的,但它们在POM的继承层次结构中不必是唯一的。合并来自不同POM的相同id的执行。这同样适用于由配置文件定义的执行。