在多模块项目中使用Maven shade插件 - NullPointerException

时间:2010-06-30 08:17:40

标签: maven maven-shade-plugin uberjar

我有一个场景,我需要创建一个包含所有模块及其依赖项的多模块maven项目的超级jar。我尝试使用maven shade插件。但它似乎只有在模块级别使用它时才有效。如果我在父pom中添加插件条目,那么构建会中断(它会尝试遮蔽父pom)

 [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]

它似乎有意义,因为父maven项目的<packaging>是pom。 但应该有一些方法为多模块项目创建一个超级jar ...任何想法人???

3 个答案:

答案 0 :(得分:13)

您不应该使用父项目的POM文件来尝试着色;你应该为此使用一个单独的聚合器项目。父maven项目用于继承,而聚合器项目用于在一组子项目上执行聚合功能;比如将他们的JAR整合成一个超级罐子。这个项目只是项目根目录下的一个pom文件(与所有子模块的文件夹相同),它引用子项目并具有shade插件配置。确保为此pom指定的打包是JAR。

以下是documentation解释POM关系以及聚合和继承之间的区别。

答案 1 :(得分:3)

是的!您可以 ! : - )

Shade有一个实现问题:它不知道什么时候在pom(而不是jar或web)项目上运行。 Pom项目不生成二进制工件,然后shade不会找到合并,移动等文件,抛出NPE。

要解决此问题,请从aggegate-Pom项目创建父POM。在其中,将阴影定义和配置配置放入某个配置文件(例如,alwaysActiveProfiles)并使用命令安装/部署它:

  

mvn deploy -P -alwaysActiveProfiles

此命令将安装此着色的父级而不运行shade plugin pom(-alwaysActiveProfiles选项supress shade plugin执行),之后,您的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,否则不会在依赖的shade-pom项目中运行shade。

答案 2 :(得分:2)

我在插件版本1.6中遇到了同样的问题,我更新到2.2并且问题解决了