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

在多模块项目中使用Maven shade插件-NullPointerException,maven,maven-shade-plugin,uberjar,Maven,Maven Shade Plugin,Uberjar,我有一个场景,在这个场景中,我需要创建一个包含所有模块及其依赖项的多模块maven项目的uber jar。我尝试使用maven shade插件。但它似乎只有在模块级使用时才起作用。如果我在父pom中添加插件条目,那么构建将中断(它尝试对父pom进行着色) 这似乎是有道理的,因为父maven项目的是pom。 但是应该有办法为多模块项目创建uber jar。。。有什么想法吗 不应使用父项目的POM文件尝试着色;您应该为此使用单独的聚合器项目。父maven项目用于继承,而聚合器项目用于对一组子项目执行

我有一个场景,在这个场景中,我需要创建一个包含所有模块及其依赖项的多模块maven项目的uber jar。我尝试使用maven shade插件。但它似乎只有在模块级使用时才起作用。如果我在父pom中添加插件条目,那么构建将中断(它尝试对父pom进行着色)

这似乎是有道理的,因为父maven项目的
是pom。
但是应该有办法为多模块项目创建uber jar。。。有什么想法吗

不应使用父项目的POM文件尝试着色;您应该为此使用单独的聚合器项目。父maven项目用于继承,而聚合器项目用于对一组子项目执行聚合功能;就像把他们的罐子放在一起做成一个超级罐子。该项目只是项目根目录(与所有子模块文件夹的级别相同)中的一个pom文件,它引用子项目并具有shade插件配置。确保为该pom指定的包装为JAR

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

是的!你可以!:-)

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

要解决此问题,请从aggegate POM项目创建父POM。在它里面,将阴影定义和配置放入一些配置文件(例如alwaysActiveProfiles),并使用以下命令安装/部署它:

mvn部署-p-alwaysActiveProfiles

此命令将在不运行shade plugin pom(-alwaysActiveProfiles选项superss shade plugin execution)的情况下安装此着色父级,之后,依赖于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>

4.0.0
xxxxxxxx
网络pom
网络pom
1.0.0-SNAPSHOT
聚甲醛
org.apache.maven.plugins
maven阴影插件
1.4
包裹
阴凉处
...
...
alwaysActiveProfiles
org.apache.maven.plugins
maven阴影插件


请记住,默认情况下,您的setting.xml必须始终启用SactiveProfiles,否则shade将不会在您的dependences shade pom项目中运行。

1.6版插件也存在同样的问题,我更新到2.2,问题得到了解决

可能的解决方法:创建一个maven项目,其中包含各个模块JAR的依赖项,并在此项目上使用着色器插件不可能,这是正确的解决方案。我遇到了类似的问题,并找到了这个答案。然而,我的项目结构正是你所描述的,但它不工作。我的顶级(聚合器)项目是POM类型的,包括几个子模块。当我试图在这个聚合器中对uber罐子进行着色时,它只会发出一个POM,而不会发出罐子。如果你能给我一些额外的提示,那就太好了?Thanks@AdrianShum-我最好的建议是阅读插件的文档,以确保您的使用是正确的。如果您仍然有问题,没有任何代码/配置,我很难帮助您。发布另一个问题,尽可能详细地解释你试图完成的任务以及你遇到的问题。别忘了包含pom的shade插件配置。然后链接到这里的问题,我会看看我是否可以帮助你。你可以使用outputFile配置来强制pom打包的聚合器作为jar输出。ie target/foo_bar.jar。可能不支持,但它可以工作
<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>