2012-05-08 74 views
1

我正在嘗試使用Maven war-plugin的<packagingExcludes>無法獲得maven-war-plugin來排除jaxb jar

這是我的配置:

  <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-war-plugin</artifactId> 
      <version>2.2</version> 
      <configuration> 
       <archive> 
        <manifestEntries> 
         <Implementation-Version>${project.artifactId}-${project.version}-r${buildNumber}</Implementation-Version> 
         <Implementation-Buildtime>${timestamp}</Implementation-Buildtime> 
        </manifestEntries> 
       </archive> 

       <packagingExcludes>WEB-INF/lib/jaxb*.jar</packagingExcludes> 
      </configuration> 
     </plugin> 

在我的理解這行:

<packagingExcludes>WEB-INF/lib/jaxb*.jar</packagingExcludes> 

應排除開始從內置.war文件 'JAXB' 所有的罐子。

不過我跑clean install後,我得到兩個:

jaxb-api-2.1.jar 
jaxb-impl-2.1.3.jar 

包裝在我的.war WEB-INF/lib目錄。

我正在使用Maven 3.

任何幫助非常感謝。

由於提前,


要回答gkamal的評論。

當我運行mvn war:war -X我可以看到:

[DEBUG] Processing: jaxb-api-2.1.jar 
[DEBUG] + WEB-INF/lib/jaxb-api-2.1.jar has been copied. 
[DEBUG] Processing: jaxb-impl-2.1.3.jar 
[DEBUG] + WEB-INF/lib/jaxb-impl-2.1.3.jar has been copied. 

而且

[DEBUG] Excluding [WEB-INF/lib/jaxb*.jar] from the generated webapp archive. 

沒有,異常,警告或錯誤,或沒有看起來很可疑的,具體什麼我應該尋找什麼?

+0

運行它與-X,看看你是否可以得到的信息 - 你可以運行戰爭:戰爭。 – gkamal

+0

@gkamal我看不到任何不尋常的東西。 – Simeon

+0

你可以嘗試用其中一個罐子而不是通配符的完整路徑嗎? – gkamal

回答

3

對於一個傳遞依賴,你可以使用exclusions元素來排除它。

<dependency> 
    <groupId>...</groupId> 
    <artifactId>...</artifactId> 
    <version>...</version> 
    <exclusions> 
     <exclusion> 
      <groupId>javax.xml.bind</groupId> 
      <artifactId>jaxb-api-2.1</artifactId> 
     </exclusion> 
    </exclusions> 
</dependency> 

由於gkamal評論,你還可以添加對JAXB的顯式依賴,其範圍設置爲provided,這將覆蓋傳遞依賴的範圍,因此不再進行包裝。

另一種選擇,戰爭插件還允許exclude based on regular expressions,但語法是有點更復雜,下面的片段應該lib,其文件名以「JAXB」開始在排除一切:

<packagingExcludes>%regex[WEB-INF/lib/jaxb.*]</packagingExcludes> 
+0

接受這一點,因爲它似乎有點清晰,並有更多的選擇(只有個人意見,兩個答案都是正確的國際海事組織)。 – Simeon

3

這意味着你將它們作爲項目的依賴項,以便將它們打包成戰爭。只要刪除依賴關係,這樣他們就不會被打包了。

根據你使用,你必須使用正則表達式,這意味着該選項的文檔,你應該寫上:

<packagingExcludes>WEB-INF/lib/jaxb.*</packagingExcludes> 

,而不是

<packagingExcludes>WEB-INF/lib/jaxb*.jar</packagingExcludes> 
+0

不,我們沒有依賴關係。依賴是傳遞性的,這意味着我們使用的庫使用JAXB實現,我們希望使用JDK實現。 – Simeon

+0

我嘗試了'WEB-INF/lib/jaxb。*'來得到相同的結果。 – Simeon

+0

我也看不到文檔應該使用哪個正則表達式。語法'**/*。xml'不是一個正則表達式,並且是文檔中的示例。 – Simeon

2

繼@ gkamal對你的問題的評論(08/05/12 @ 11:52),檢查你的maven-war-plugin的版本。我剛剛花了2個小時看着這個問題,以便將一個未知的瞬態排除到javaee-api * .jar。

使用maven 3.0.4,我被默認爲maven-war-plugin 2.1版(你可以告訴你是否在調試中運行你的構建 - 例如mvn clean package -X)。您的其他評論之一是在package-excludes之後發表的。請參閱war plugin page for details(儘管描述條目的實際頁面並未指示版本信息,但這是您首次搜索的版本信息)。

如果更新到Maven的戰爭插件2.3(添加<version>2.3</version>,您packaging-excludes應該被使用。但是請注意,你只會看到這個內置戰爭的WEB-INF/lib下,而不是在短暫的戰爭目錄(包括排除罐子即使調試說,他們是被排除在外,這個問題看的時候),這是非常混亂。

<plugins> 
    <plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-war-plugin</artifactId> 
    <version>2.3</version> 
    ... 
    <packagingExcludes> 
     WEB-INF/lib/whatever-*.jar, 
     WEB-INF/lib/javaee-api-*.jar 
    </packagingExcludes> 
    ... 
    </plugin> 
    ... 

然而,在最佳實踐方面,這可能是一個最後關頭努力排除戰爭中的罐子和瞬態罐子的依賴級別排除可能是最準確和最正確的方式。那麼,如果一個瞬變罐子被多重依賴帶入,會怎麼樣?

因此,隨着版本升級,我認爲@khmarbaise的解決方案是好的(和評論表明它不會工作是錯誤的)。但是,我認爲最佳做法是根據您接受的答案使用依賴級別排除。

0

您可以通過在</configuration><configuration>內指定<packagingExcludes></packagingExcludes>來完成此操作。

<project> 
    ... 
    <build> 
    <plugins> 
     <plugin> 
     <artifactId>maven-war-plugin</artifactId> 
     <version>3.2.0</version> 
     <configuration> 
      <packagingExcludes> 
      WEB-INF/lib/ex1-*.jar, 
      WEB-INF/lib/ex2-logging-*.jar 
      </packagingExcludes> 
     </configuration> 
     </plugin> 
    </plugins> 
    </build> 
    ... 
</project> 

您可以通過通配符正則表達式指定路徑了。有關更多信息,請參閱此link