maven插件中的执行和配置有什么区别?

时间:2015-11-25 04:05:38

标签: maven maven-plugin

I found this description但似乎并不全面。有人可以详细解释maven插件中configurations和{{1}}之间的区别吗?

3 个答案:

答案 0 :(得分:3)

<execution>导致插件在maven构建生命周期中执行,即在构建期间执行。 <configuration>允许您配置插件在执行期间的行为方式。许多Maven插件提供有关其配置选项的文档,例如: maven-compiler-plugin

您可以在<configuration>级别或<plugin>级别定义<execution>。前者对所有执行都是全局有效的,后者特定于执行。

全局执行特定配置的示例:

假设您必须使用Java 1.7编译项目,但是您希望尽早采用Java 9 Jigsaw功能并在项目中添加module-info.java。此Java文件不会使用源级别1.7进行编译。你可以做的是定义maven-compiler-plugin的两个执行,一个编译除了源代码级别为1.7的module-info.java之外的所有内容,另一个只编译源代码级别为1.9的module-info.java

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-compiler-plugin</artifactId>
  <version>3.3</version>

  <!-- Global plugin configuration for source and target levels. -->
  <configuration>
    <source>1.7</source>
    <target>1.7</target>
  </configuration>

  <executions>
    <!-- Compile all code except module-info.java with the configured source level -->
    <execution>
      <id>default-compile</id>
      <phase>compile</phase>
      <goals>
        <goal>compile</goal>
      </goals>
      <configuration>
        <excludes>
          <exclude>module-info.java</exclude>
        </excludes>
      </configuration>
    </execution>

    <!-- Compile module-info.java with source level 1.9 -->
    <execution>
      <id>compile-module-info-java</id>
      <phase>compile</phase>
      <goals>
        <goal>compile</goal>
      </goals>
      <configuration>
        <source>1.9</source>
        <target>1.9</target>
        <includes>
          <include>module-info.java</include>
        </includes>
      </configuration>
    </execution>
  </executions>
</plugin>

答案 1 :(得分:1)

<configuration>部分之外的<execution>块会以一般方式影响插件的行为。例如,直接通过CLI执行或具有绑定到的默认阶段的插件将使用此类配置。这种插件的一个例子是compiler插件。

另一方面,<configuration>块内的<{1}}部分 <execution>块仅适用于该特定执行。

与往常一样,更具体的配置可以覆盖常规配置。因此,如果一般配置(在执行块之外)显示<doCheck>false</doCheck>,执行可能会选择通过执行<doCheck>true</doCheck>来覆盖它。

一般配置的另一个特性是它们的参数将由该插件的所有执行继承。

答案 2 :(得分:1)

我认为来自@Stefan的回答已经很清楚了。如果有帮助,我想更加冗长。

插件下的“执行”声明“什么时候应该做什么”。基本上,execution通常至少包含:phasegoal(我知道你并不总是在配置中看到它,但在概念上它们就在那里),你可以看到它:当构建过程达到phase时,将执行插件的goal操作。

当然,您可以为插件添加多个execution,以便可以在不同/相同的阶段运行不同/相同的目标。

然后来configuration。有时您需要告诉插件有关插件应该如何操作的额外细节,因为插件可能无法猜测默认情况下您想要做什么。 configuration正在做这样的工作。您可以参考插件目标文档,了解他们接受的配置类型。

插件级configuration将应用于插件的所有execution,同时您还可以在每个configuration下定义execution,其中execution用作configuration - 特定配置。插件级configuration +执行级execution.next()收到的“真实”配置。