我有一个场景,我需要创建一个包含所有模块及其依赖项的多模块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 ...任何想法人???
答案 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并且问题解决了