Использование плагина 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, и проблема была решена

Другие вопросы по тегам