如何

2016-11-29 68 views
0

我使用屬性Maven插件讀一些屬性來執行Maven插件多次後,再執行這個插件我執行另一個插件,之後,我想不同的配置再次執行這個插件如何

<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-插件再回想這個插件與配置「的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插件託從文件Args2

+0

什麼是您的全球通緝用例?在構建過程中完全不同的時間讀取2個屬性並在兩者之間運行AntRun插件時,您想要解決什麼問題? – Tunaki

+0

在AntRun插件中給prop一個值之後,我想稍後從Args2讀取prop2,將它包含爲prop的新值 –

+0

是的,但這是[XY Problem](http://meta.stackexchange.com/questions/66377/what-the-xy-problem),爲什麼你有這個設置? – Tunaki

回答

1

有在構建Maven插件的另一執行後讀PROP2簡單地通過指定另一<execution>塊完成後,和通過在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在B之前在POM中,並且它會在之前被執行,這是不需要的(因爲之前需要運行一個B的執行),或者B在A之前,並且B的兩個執行將是在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,但該依賴性會使插件繼承舊版本。還請注意<exportAntProperties>這將使您的構建能夠使用在Ant任務中創建的屬性,並使用<target>而不是已棄用的<tasks>