2010-06-30 157 views
12

我有一個場景,我需要創建一個多模塊maven項目的超級jar包括所有模塊及其依賴項。我嘗試使用maven shade插件。但它似乎只在模塊級別使用它時才起作用。如果我添加在父POM的插件項,則生成中斷(它試圖蔭父POM)在多模塊項目中使用Maven遮罩插件 - NullPointerException

[INFO] Replacing original artifact with shaded artifact. 
[INFO] Replacing null with C:\Projects\foo.bar\target\foobar-0.0.1-SNAPSHOT-shaded.pom 
[INFO] ------------------------------------------------------------------------ 
[ERROR] BUILD ERROR 
[INFO] ------------------------------------------------------------------------ 
[INFO] Error creating shaded jar: null: NullPointerException -> [Help 1] 

它似乎是有道理的,因爲<packaging>父Maven項目的POM。 但是,應該有一些方法來創建一個多模塊項目的超級罐子...任何想法的人?

+0

可能的解決方法:創建具有依賴性的Maven項目爲獨立模塊罐子,並在此項目中使用的着色器插件 – Manoj 2010-06-30 08:33:43

+2

不太可能,那是正確的解決方案。 – 2010-07-02 06:58:33

回答

13

您不應該使用您的父項目的POM文件來嘗試着色;你應該爲此使用一個單獨的聚合器項目。父Maven項目用於繼承,而聚合器項目用於對一組子項目執行聚合函數;像將他們的JAR一起遮蔽成一個超級罐子。該項目只是一個pom文件,位於項目根目錄(與所有子模塊文件夾相同),它引用子項目並具有陰影插件配置。確保爲這個pom指定的packaing是JAR。

這裏是documentation解釋聚甲醛關係和聚合與繼承之間的區別。

+0

我遇到類似的問題,並找到了這個答案。但是,我的項目結構與您所描述的完全相同,但不起作用。我的頂級(聚合器)項目是POM類型,幷包含多個子模塊。當我試圖在這個聚合器中遮蔽一個超級罐子時,它只會發出一個聚甲醛,而不是JAR。如果你能提供一些額外的提示,這將是非常棒的。謝謝 – 2012-04-26 07:55:26

+0

@Adrian Shum - 我最好的建議是閱讀插件的文檔,以確保您的使用是正確的。 HTTP://maven.apache。org/plugins/maven-shade-plugin /如果你仍然有問題,我很難在沒有任何代碼/配置的情況下幫助你。用盡可能多的細節發佈另一個問題,解釋你正在嘗試完成什麼以及遇到什麼問題。不要忘記包含你的pom的shade-plugin配置。然後在這裏鏈接到問題,我會看看我能否幫助你。 – 2012-04-27 14:31:59

+0

您可以使用outputFile配置強制pom打包的聚合器以jar的形式輸出。即 target/foo_bar.jar。可能不支持,但它的工作原理 – mlathe 2012-08-03 22:40:15

3

是的!您可以 ! :-)

陰影有一個實現問題:它不知道何時運行pom(而不是jar或web)項目。 Pom項目不會生成二元文物,然後陰影不會找到合併,移動等文件,拋出NPE。

要解決此問題,請從您的aggegate-Pom項目創建一個父POM。它裏面,放在陰涼處定義和配置功能配置一些個人資料(如alwaysActiveProfiles)和安裝/使用命令部署:

MVN部署-P -alwaysActiveProfiles

此命令將安裝此陰影父母沒有運行陰影插件POM(-alwaysActiveProfiles選項陰影插件執行),然後,你的Maven依賴項目將工作。 你的陰影父POM可能是這樣的:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 

<modelVersion>4.0.0</modelVersion> 
<groupId>xxxxxxxx</groupId> 
<artifactId>web-pom</artifactId> 
<name>web-pom</name> 
<version>1.0.0-SNAPSHOT</version> 
<packaging>pom</packaging> 

<build> 
    <pluginManagement> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-shade-plugin</artifactId> 
       <version>1.4</version> 
       <executions> 
        <execution> 
         <phase>package</phase> 
         <goals> 
          <goal>shade</goal> 
         </goals> 
         <configuration> 
          ... 
         </configuration> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
    </pluginManagement> 
</build> 
<dependencies> 
    ... 
</dependencies> 

<profiles> 
    <profile> 
     <id>alwaysActiveProfiles</id> 
     <build> 
      <plugins> 
       <plugin> 
        <groupId>org.apache.maven.plugins</groupId> 
        <artifactId>maven-shade-plugin</artifactId> 
       </plugin> 
      </plugins> 
     </build> 
    </profile> 
</profiles> 

記住,你的Setting.xml的必須默認啓用alwaysActiveProfiles,否則色光會不會在你的依賴蔭,聚甲醛項目的運行。

2
我與插件的1.6版本相同的問題

,我更新到2.2,問題就解決了