2010-06-30 159 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,问题就解决了