2014-02-12 30 views
5

我是Maven的新手。如果這是一個愚蠢的問題,我很抱歉。我有一個Maven Eclipse項目和一個使用陰影插件創建可運行jar的pom文件。我的計劃是在版本中包含一個的幾個屬性文件(如果我的術語不正確,請糾正我的錯誤,我真的很綠)。我有多個位於src/main/resources中的屬性文件。對運行Jars使用不同的屬性文件,Maven Eclipse

我想找到一種方法來在可運行jar中僅包含適用的屬性文件。具體來說,我在我的項目中有兩個屬性文件(config1.properties,config2.properties),每個構建將只使用這些文件中的一個,具體取決於生成的jar的所需功能。屬性文件將被重新分配一個通用名稱,特別是「defaultconfig.properties」,以便它與代碼很好地配合。

生成的jar文件(針對每個不同屬性文件的不同文件)將作爲單獨的cron作業運行。我想我將使用不同的Jenkins項目來根據屬性文件爲項目配置什麼任務(我認爲我已獲得此部分)來將可運行jar部署到特定服務器。 cron作業將在這些服務器上運行。

我的問題是:

1)哪裏的邏輯去確定哪些屬性文件在運行的JAR中包括什麼?例如,假設我有config1.properties(指定使用var1 = blah和var2 = blip和var3 = boink)和config2.properties(它指定使用var1 = duh var2 = dip和var3 = doink) 。 我在哪裏告訴Maven這兩個文件中的哪一個用於特定構建?

2)我是否應該傳入一個參數,告訴Maven要使用哪個屬性文件?如果是這樣,我也要傳遞這個參數?這是可以在Jenkins項目中配置的東西嗎? (即使只是一些基本的閱讀能幫助我,因爲我不確定這是一個maven問題還是jenkins問題,我都是綠色的。)

這是我的pom.xml的相關部分文件:

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-shade-plugin</artifactId> 
      <version>2.2</version> 
      <executions> 
       <execution> 
        <phase>package</phase> 
        <goals> 
         <goal>shade</goal> 
        </goals> 
        <configuration> 
         <transformers> 
          <transformer 
           implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
           <mainClass>com.foo.dashboard.bar.Runner</mainClass> 
          </transformer> 
         </transformers> 
         <finalName>FooBar</finalName> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 

我一直在使用IncludeResourceTransformer重命名的屬性文件,並試圖,但不知道如何包括基於所需的jar文件的功能切換屬性文件的邏輯。

謝謝。

+1

你在找這樣的事嗎? http://rajendra.wordpress.com/2012/02/22/maven-filtering-resources-conditionally-while-packaging/ – DevZer0

+1

我想你需要的是* *的配置文件:您可以定義其中幾個,他們每個人都可以定義相同的屬性但具有不同的值。然後,您可以使用該屬性來指定您必須在當前版本中包含哪些屬性文件。 – rlegendi

+0

@ DevZer0 - 這似乎回答了我正在尋找的部分內容,即提供了一種方法來自定義在構建過程中使用的屬性文件。真棒。一些跟進問題。我注意到資源標籤是一個布爾值。如果有兩種以上的配置選擇會怎樣?鑑於這確實提供了一種在配置之間切換的方式,在生成jar文件時如何指定值? –

回答

1

這就是我想出來的。我很想知道其他方法或最好的方法來做到這一點。對所有這些都是全新的。

  1. 在同一個插件中創建單獨的執行。注意:它們必須分配有不同的<id>值。
  2. 每個<execution>可以配置不同。要重命名包含的資源,請使用<transfomer> implementation = implementation =「org.apache.maven.plugins.shade.resource.IncludeResourceTransformer」>。
  3. 要排除不需要的資源(在我的情況下,其他屬性文件)使用<transformer> implementation =「org.apache.maven.plugins.shade.resource.DontIncludeResourceTransformer」>。這比必要性更精細。爲什麼要在你的jar中捆綁不需要的文件?
  4. 確保每個<execution>都有不同<finalName>使得所得到的罐子不互相覆蓋。

這是我的POM文件。

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-shade-plugin</artifactId> 
      <version>2.2</version> 
      <executions> 
       <execution> 
        <id>ID1</id> 
        <phase>package</phase> 
        <goals> 
         <goal>shade</goal> 
        </goals> 
        <configuration> 
         <transformers> 
          <transformer 
           implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
           <mainClass>com.foo.dashboard.bar.Runner</mainClass> 
          </transformer> 
          <transformer 
           implementation="org.apache.maven.plugins.shade.resource.IncludeResourceTransformer"> 
           <resource>defaultconfig.properties</resource> 
           <file>src/main/resources/defaultconfig_1.properties</file> 
          </transformer> 
          <transformer 
           implementation="org.apache.maven.plugins.shade.resource.DontIncludeResourceTransformer"> 
           <resource>defaultconfig_2.properties</resource> 
          </transformer> 
         </transformers> 
         <finalName>FooBar1</finalName> 
        </configuration> 
       </execution> 
       <execution> 
        <id>ID2</id> 
        <phase>package</phase> 
        <goals> 
         <goal>shade</goal> 
        </goals> 
        <configuration> 
         <transformers> 
          <transformer 
           implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
           <mainClass>com.foo.dashboard.bar.Runner</mainClass> 
          </transformer> 
          <transformer 
           implementation="org.apache.maven.plugins.shade.resource.IncludeResourceTransformer"> 
           <resource>defaultconfig.properties</resource> 
           <file>src/main/resources/defaultconfig_2.properties</file> 
          </transformer> 
          <transformer 
           implementation="org.apache.maven.plugins.shade.resource.DontIncludeResourceTransformer"> 
           <resource>defaultconfig_1.properties</resource> 
          </transformer> 
         </transformers> 
         <finalName>FooBar2</finalName> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 

我知道這是不是最終答案,因爲這建立產量多的jar文件,我本來想找那會給我一個解決方案只與特定的屬性相關聯的jar文件文件,而不是所有的來自所有屬性文件的jar文件。

,關於如何提高這個解決方案,因此我仍然在考慮建議,以便構建只會屈服一個罐子。