首页 文章

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

提问于
浏览
12

我有一个场景,我需要创建一个包含所有模块及其依赖项的多模块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 回答

  • 2

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

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

  • 13

    是的!您可以 ! :-)

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

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

    mvn deploy -P -alwaysActiveProfiles

    此命令将安装此着色父级而不运行shade插件pom(-alwaysActiveProfiles选项supress shade插件执行),之后,您的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 .

  • 3

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

相关问题