Подтвердить что ты не робот

Использование плагина 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 для проекта с несколькими модулями... Любые идеи людей???

4b9b3361

Ответ 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 и проблема была решена.