【问题标题】:Using Maven shade plugin in a multi module project - NullPointerException在多模块项目中使用 Maven 阴影插件 - NullPointerException
【发布时间】:2011-03-10 00:25:19
【问题描述】:

我有一个场景,我需要创建一个包含所有模块及其依赖项的多模块 maven 项目的 uber jar。我尝试使用 Maven 阴影插件。但它似乎只有在我在模块级别使用它时才有效。如果我在父 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。 但是应该有一些方法可以为多模块项目创建一个 uber jar ......有什么想法吗?

【问题讨论】:

  • 可能的解决方法:为各个模块 jar 创建一个具有依赖关系的 maven 项目,并在此项目上使用着色器插件
  • 不可能,这是正确的解决方案。

标签: maven maven-shade-plugin uberjar


【解决方案1】:

1.6 版本的插件也有同样的问题,我更新到 2.2 后问题解决了

【讨论】:

    【解决方案2】:

    是的!你可以 ! :-)

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

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

    mvn deploy -P -alwaysActiveProfiles

    此命令将在不运行 shade 插件 pom(-alwaysActiveProfiles 选项抑制 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 将不会在您的依赖 shade-pom 项目中运行。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 我遇到了类似的问题并找到了这个答案。但是,我的项目结构与您描述的完全一样,但它不起作用。我的顶级(聚合器)项目是 POM 类型的,包括几个子模块。当我试图在这个聚合器中隐藏一个 uber-jar 时,它只给出一个 POM 而不是 JAR。如果您能提供一些额外的提示,那就太好了?谢谢
      • @Adrian Shum - 我最好的建议是阅读插件的文档以确保您的使用是正确的。 maven.apache.org/plugins/maven-shade-plugin如果你还是有问题,我很难在没有任何代码/配置的情况下帮助你。发布另一个问题,尽可能详细地解释您要完成的工作以及遇到的问题。不要忘记包含你的 pom 的 shade-plugin 配置。然后在此处链接到问题,我会看看是否可以帮助您。
      • 您可以使用 outputFile 配置来强制 pom 打包的聚合器输出为 jar。即target/foo_bar.jar。可能不支持,但它可以工作
      猜你喜欢
      • 2014-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-27
      • 2011-07-08
      • 2014-07-27
      • 2012-03-06
      • 2015-07-29
      相关资源
      最近更新 更多