2013-07-09 123 views
3

我們試圖從同一個pom文件(並且是的,我讀this Sonotype blog post說不要)構建兩個罐子,因爲我們需要一個包含我們所有資源的工具,而另一個沒有出於內部政治原因。我們已經配置了maven-jar-plugin配置,我們認爲應該工作,但資源總是包含在內。下面是我們的POM文件的相關部分:maven-jar-plugin排除失敗

<plugins> 
    <plugin> 
     <artifactId>maven-jar-plugin</artifactId> 
     <executions> 
      <execution> 
       <id>package-consumer</id> 
       <phase>package</phase> 
       <configuration> 
        <classifier>consumer</classifier> 
        <resources> 
         <resource> 
          <directory>src/main/resources</directory> 
          <filtering>true</filtering> 
          <excludes> 
           <exclude>**/*.bmp</exclude> 
           <exclude>**/*.jpg</exclude> 
           <exclude>**/*.jpeg</exclude> 
           <exclude>**/*.gif</exclude> 
           <exclude>**/*.xml</exclude> 
           <exclude>**/*.sql</exclude> 
           <exclude>**/*.log4j</exclude> 
           <exclude>**/*.properties</exclude> 
           <exclude>**/*.sh</exclude> 
          </excludes> 
         </resource> 
        </resources> 
       </configuration> 
       <goals> 
        <goal>jar</goal> 
       </goals> 
      </execution> 
     </executions> 
    </plugin> 
</plugins> 

當我們建立,我們得到OurProject.Jar和OurProject-consumer.jar正如人們所期望的,但所有相同的資源在每個jar文件。

我們嘗試過<exclude>**/*</exclude><exclude>**/resources/*.*</exclude>而不是列表或特定擴展名。沒有快樂。我希望我們缺少一些基本的東西。

回答

4

我建議你使用maven-assembly-plugin作爲你的消費者jar,但由於你決定用maven-jar-plugin來做,所以讓我們來修復你的構建。

這裏的問題是,您將一個設置阻止來自being filtered的資源與從jar中實際排除資源的設置混淆(均使用<exclude />標記)。

以下配置(在<plugins />之內)在包階段觸發第二次調用jar:jar。這將排除從消費者的jar所需的資源(有效地做你想要什麼):

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-jar-plugin</artifactId> 
    <version>2.4</version> 
    <executions> 
     <execution> 
     <id>package-consumer</id> 
     <phase>package</phase> 
     <goals> 
      <goal>jar</goal> 
     </goals> 
     <configuration> 
      <classifier>consumer</classifier> 
      <excludes> 
      <exclude>**/*.bmp</exclude> 
      <exclude>**/*.jpg</exclude> 
      <exclude>**/*.jpeg</exclude> 
      <exclude>**/*.gif</exclude> 
      <exclude>**/*.xml</exclude> 
      <exclude>**/*.sql</exclude> 
      <exclude>**/*.log4j</exclude> 
      <exclude>**/*.properties</exclude> 
      <exclude>**/*.sh</exclude> 
      </excludes> 
     </configuration> 
     </execution> 
    </executions> 
    </plugin> 

儘管此配置(內部<resources />)使濾波XML(即財產使用過程中工藝資源相resource:resource替換)和屬性文件;但不適用於未經更改的圖像和其他二進制文件。

<resource> 
    <directory>src/main/resources</directory> 
    <filtering>true</filtering> 
    <includes> 
     <include>**/*.xml</include> 
     <include>**/*.properties</include> 
    </includes> 
    </resource> 
    <resource> 
    <directory>src/main/resources</directory> 
    <filtering>false</filtering> 
    <excludes> 
     <exclude>**/*.xml</exclude> 
     <exclude>**/*.properties</exclude> 
    </excludes> 
    </resource> 

在這兩種配置的情況下,您將實際構建兩個罐子。所有資源的默認值(包括過濾的xml和屬性文件)以及不含資源的輔助消費者jar。

+0

感謝@安東尼 - Acioly。只要將標記移出即可解決問題。我不瞭解您的標記塊的需求,因爲我們的罐子在沒有它們的情況下似乎是正確的。 – cneff

+0

我們碰到的另一個警告是:當我們首先做出改變時,它正確地從消費者jar中排除了POM文件,這意味着沒有對consuer jar中的任何內容進行更改,所以它不會重建它!不用說,直到我們注意到兩個jar文件中的不同時間戳之後,這導致我們有些困惑和沮喪。 – cneff

+0

第二個設置是爲了啓用[過濾](http://maven.apache.org/plugins/maven-resources-plugin/examples/filter.html)一組文件擴展名(同時複製其他資源不變) 。我假設你需要過濾,因爲原始的' true'。至於pom.xml,如果你想要它,你可能需要重新考慮' **/*。xml'模式。 –

2

我會建議做這樣的:

<build> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-jar-plugin</artifactId> 
     <executions> 
      <execution> 
      <id>second-jar</id> 
      <goals> 
       <goal>jar</goal> 
      </goals> 
      <configuration> 
       <classifier>without</classifier> 
       <excludes> 
       <exclude>**/*</exclude> 
       </excludes> 
      </configuration> 
      </execution> 
     </executions> 
     </plugin> 
    </plugins> 
    </build> 
+0

當然,更換排除部分(否則您將創建一個空罐子)。 –

+0

感謝您快速回答@khmarbaise!考慮到安東尼的編輯,該解決方案奏效。 – cneff