【问题标题】:How to execute maven Plugins multiple times如何多次执行maven插件
【发布时间】:2017-04-13 11:45:35
【问题描述】:

我正在使用Properties Maven Plugin 来读取一些Properties,在执行这个插件后我执行另一个插件,之后我想用不同的配置再次执行这个插件

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>properties-maven-plugin</artifactId>
    <version>1.0.0</version>
    <executions>
        <execution>
            <phase>initialize</phase>
            <goals>
                <goal>read-project-properties</goal>
            </goals>
            <configuration>
                <files>
                    <file>src/Args.properties</file>
                </files>
            </configuration>
        </execution>
  </executions>
</plugin>

执行 maven-antrun-plugin,然后用配置“src/Args2.properties”调用这个插件,因为在最后一个插件中我声明了一个新属性,它在文件“Args2.properties”中使用

<plugin>
    <artifactId>maven-antrun-plugin</artifactId>
    <version>1.3</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>run</goal>
            </goals>
            <configuration>
                <tasks>
                    <taskdef resource="net/sf/antcontrib/antcontrib.properties"
                             classpathref="maven.plugin.classpath"/>

                    <if>
                        <equals arg1="${serviceType}" arg2="none"/>
                        <then>
                            <property name="prop" value="x"/>
                        </then>
                        <else>
                           <property name="prop"value="y"/>
                        </else>
                    </if>
                </tasks>
            </configuration>
        </execution>
    </executions>
</plugin>

和 Args2.properties :

prop2=${prop}/anotherValue

我想在 Antrun 插件中为 prop 赋值后,稍后从文件 Args2 中读取 prop2

【问题讨论】:

  • 您的全球通缉用例是什么?通过在构建中完全不同的时间读取 2 个属性并在其间运行 AntRun 插件,您想解决什么问题?
  • 在 AntRun 插件中给 prop 赋值后,我想稍后从 Args2 中读取 prop2,将它包含在 prop 的新值中
  • 是的,但我是XY Problem,你为什么一开始就有这个设置?
  • prop 的值与 serviceType 的值有关...例如 if serviceType= value1 then prop 有 x else prop 有值 y
  • @MalazAlbawarshi 你还是没能解释为什么你想要这个。

标签: maven plugins pom.xml


【解决方案1】:

在构建中再次执行 Maven 插件只需指定另一个 &lt;execution&gt; 块,不通过在 POM 中指定两次插件来完成:

<plugin>
  <groupId>my.groupid</groupId>
  <artifactId>my-plugin</artifactId>
  <version>version</version>
  <executions>
    <execution>
      <id>execution-1</id>
      <phase>initialize</phase>
      <!-- goals and configuration for this execution -->
    </execution>
    <execution>
      <id>execution-2</id>
      <phase>test</phase>
      <!-- goals and configuration for this execution -->
    </execution>
  </executions>
</plugin>

例如,上面的配置将定义插件的两次执行,其中第一次绑定到initialize 阶段,而另一个绑定到test 阶段。当 2 个执行绑定到同一个阶段时,它们将按照它们在 POM 中的声明顺序执行:这意味着即使 execution-2 将绑定到 initialize 阶段,就像 execution-1 一样,它也会被执行在execution-1之后。

在您的情况下,您在构建中读取多个属性文件并不是很传统,而是以某种方式在两者之间交错执行maven-antrun-plugin 插件。这很麻烦,因为您不能在 POM 中两次声明插件,因此不可能在同一阶段的另一个插件 B 的两次执行之间插入插件 A 的执行。这是正常的,因为在给定阶段的执行是按照 POM 中的声明顺序执行的,并且插件必须声明一次;所以要么 A 在 POM 中的 B 之前,它会在之前执行,这是不想要的(因为 B 的一次执行需要在之前运行),或者 B 在 A 之前,B 的 2 次执行将是在 A 之前执行,这也是不需要的(因为 A 的执行需要在两者之间发生)。

解决此问题的一种方法是将执行绑定到不同的阶段:例如确保我们首先要运行的 B 的执行绑定到某个阶段,并且我们要运行的 A 的执行绑定到构建中稍后发生的阶段,最后是 B 的最后执行也必然是后期。不过,这不是一个干净的解决方案,因为您最终会滥用某些阶段来做目前不应该做的事情。

更好的解决方案是接受这样一个事实,即我们真正想要在单个执行中一步完成的事情:即在同一个执行中加载一个属性、做一些事情、加载另一个属性。它们是如此紧密地联系在一起,因此将它们整合在一起也是有意义的。这并不总是容易做到的——通常,您需要创建自己的 Maven 插件来执行此操作,以便所有这些任务都被它封装。

但是,在这种特定情况下,您可以重用 maven-antrun-plugin 并在执行此插件时执行所有操作。 Ant 有一个任务loadproperties,可用于在设置prop 属性之前和之后加载属性文件。

<plugin>
  <artifactId>maven-antrun-plugin</artifactId>
  <version>1.8</version>
  <executions>
    <execution>
      <id>load-properties</id>
      <phase>initialize</phase>
      <goals>
        <goal>run</goal>
      </goals>
      <configuration>
        <target>
          <loadproperties srcFile="${project.basedir}/src/Args.properties" />
          <taskdef resource="net/sf/antcontrib/antcontrib.properties"
            classpathref="maven.plugin.classpath" />
          <if>
            <equals arg1="${serviceType}" arg2="none" />
            <then>
              <property name="prop" value="x" />
            </then>
            <else>
              <property name="prop" value="y" />
            </else>
          </if>
          <loadproperties srcFile="${project.basedir}/src/Args2.properties" />
        </target>
        <exportAntProperties>true</exportAntProperties>
      </configuration>
    </execution>
  </executions>
  <dependencies>
    <dependency>
      <groupId>ant-contrib</groupId>
      <artifactId>ant-contrib</artifactId>
      <version>1.0b3</version>
      <exclusions>
        <exclusion>
          <groupId>ant</groupId>
          <artifactId>ant</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
  </dependencies>
</plugin>

上面声明的一些注意事项:插件已更新到最新版本的1.8,并且需要对ant-contrib 的依赖来解析antcontrib.properties 文件。 ant 需要从对 ant-contrib 的依赖中排除,因为 AntRun 插件使用 Ant 1.9,但这种依赖会使插件继承旧版本。还要注意&lt;exportAntProperties&gt;,这将使您的构建能够使用在Ant 任务中创建的属性,并且使用&lt;target&gt; 而不是已弃用的&lt;tasks&gt;。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多