Использование плагина Maven Shade в многомодульном проекте - NullPointerException
У меня есть сценарий, в котором мне нужно создать Uber JAR для многомодульного проекта Maven, включая все модули и их зависимости. Я попробовал использовать плагин 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]
Это имеет смысл, так как <packaging>
для родительского проекта maven это пом. Но должен быть какой-то способ создать Uber JAR для многомодульного проекта... Есть идеи, люди???
3 ответа
Вы не должны использовать POM-файл вашего родительского проекта для попытки затенения; Вы должны использовать отдельный проект агрегатора для этого. Родительские проекты maven используются для наследования, в то время как агрегаторные проекты используются для выполнения агрегатных функций над группой подпроектов; как затенение их банок вместе в супер банку. Этот проект будет просто файлом pom в корневом каталоге вашего проекта (того же уровня, что и папки всех подмодулей), который ссылается на подпроекты и имеет конфигурацию плагина shade. Убедитесь, что упаковка, указанная для этого контейнера, является JAR.
Вот документация, объясняющая отношения POM и разницу между агрегацией и наследованием.
Да! Вы можете!:-)
У Shade есть проблема с реализацией: он не знает, когда работает над pom (не jar или web) проектом. Проекты Pom не генерируют двоичные артефакты, затем затенение не находит файлы для слияния, перемещения и т. Д., Бросая NPE.
Чтобы решить эту проблему, создайте родительский POM из вашего проекта aggegate-Pom. Внутри него поместите определения теней и настройку конфигурации в некоторый профиль (например, alwaysActiveProfiles) и установите / разверните его с помощью команды:
mvn deploy -P -alwaysActiveProfiles
Эта команда установит этого затененного родителя без запуска плагина затенения pom (опция -alwaysActiveProfiles supress shade plugin выполнение) и после этого ваши зависимые проекты maven будут работать. Ваш затененный родительский пом может выглядеть так:
<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 зависимостей.
У меня была такая же проблема с версией 1.6 плагина, я обновился до 2.2, и проблема была решена