我有一个场景,我需要创建一个包含所有模块及其依赖项的多模块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 回答
您不应该使用父项目的POM文件来尝试着色;你应该为此使用一个单独的聚合器项目 . 父maven项目用于继承,而聚合器项目用于在一组子项目上执行聚合函数;比如将他们的JAR整合成一个超级 jar . 这个项目只是项目根目录下的一个pom文件(与所有子模块的文件夹相同),它引用子项目并具有shade插件配置 . 确保为此pom指定的打包是JAR .
这是documentation解释POM关系以及聚合和继承之间的区别 .
是的!您可以 ! :-)
Shade有一个实现问题:它不知道什么时候在pom(而不是jar或web)项目上运行 . Pom项目不生成二进制工件,然后阴影不会找到合并,移动等文件,抛出NPE .
要解决此问题,请从aggegate-Pom项目创建父POM . 在其中,将阴影定义和配置配置放入某个配置文件(例如,alwaysActiveProfiles)并使用命令安装/部署它:
此命令将安装此着色父级而不运行shade插件pom(-alwaysActiveProfiles选项supress shade插件执行),之后,您的maven依赖项目将起作用 . 你阴影的父母pom看起来像这样:
请记住,您的setting.xml默认情况下必须启用alwaysActiveProfiles,否则不会在依赖的shade-pom项目中运行shade .
我在插件版本1.6中遇到了同样的问题,我更新到2.2并且问题解决了