5

我正在查看我正在检查的 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 必须是唯一的,在 pom 中不一定跨越继承的 pom,但它没有提到它是如何使用的。

4

2 回答 2

7

至少对于 Maven 3.0.x,如果没有指定,执行的 ID 是 default -goalName。因此,对于您拥有的示例,ID 将是default-check. 该值default-cli还可用于配置命令行执行。

从 POM 本身、任何父 POM(包括 Maven 超级 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>

使用上面的配置:

  • mvn clean package - 构建 firstJar.jar 和 duplicateJar.jar
  • mvn jar:jar - 构建 cmdLineJar.jar(注意,没有干净的生命周期!)
  • mvn clean jar:jar - 删除目标目录,构建空(除了清单)cmdLineJar.jar;因为 jar:jar 没有运行完整的生命周期,只是一个目标
  • mvn clean prepare-package jar:jar - 通过 prepare-package 运行生命周期,然后构建一个非空的 cmdLineJar.jar
于 2013-09-27T17:49:32.667 回答
4

这个问题不能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足以让它运行,因此它被分配了一个默认的执行 IDdefault并被执行。

案例 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 POMjar 包装类型:

当没有声明打包时,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 的执行被合并。这同样适用于配置文件定义的执行。

于 2013-09-27T17:52:25.123 回答