13

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

这似乎很有意义,因为<packaging>父 maven 项目是 pom。但是应该有一些方法可以为多模块项目创建一个 uber jar ......有什么想法吗?

4

3 回答 3

13

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

这是解释 POM 关系以及聚合和继承之间差异的文档。

于 2010-07-05T19:09:33.780 回答
4

是的 !你可以 !:-)

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>

Remember that your setting.xml must have alwaysActiveProfiles enabled by default, otherwise shade will not run in your dependences shade-pom projects.

于 2011-01-04T19:52:10.653 回答
2

I was having the same problem with version 1.6 of the plugin, I updated to 2.2 and the problem was solved

于 2014-03-07T12:18:59.267 回答