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