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


person Manoj    schedule 30.06.2010    source источник
comment
Вероятный обходной путь: создайте проект maven с зависимостями для отдельных jar-файлов модуля и используйте плагин шейдера в этом проекте.   -  person Manoj    schedule 30.06.2010
comment
Не исключено, это правильное решение.   -  person Dominic Mitchell    schedule 02.07.2010


Ответы (3)


Вы не должны использовать файл POM вашего родительского проекта для попытки затенения; для этого вам следует использовать отдельный проект агрегатора. Родительские проекты maven используются для наследования, а проекты-агрегаторы используются для выполнения агрегатных функций над группой подпроектов; например, затенение их JAR вместе в банку uber. Этот проект будет просто файлом pom в корневом каталоге вашего проекта (на том же уровне, что и папки всех подмодулей), который ссылается на подпроекты и имеет конфигурацию плагина тени. Убедитесь, что для этого pom указана упаковка JAR.

Вот документация, объясняющая отношения POM и разницу между агрегацией и наследованием.

person Jesse Webb    schedule 05.07.2010
comment
Я столкнулся с подобной проблемой и нашел этот ответ. Однако у меня структура проекта точно такая же, как вы описали, но она не работает. Мой проект верхнего уровня (агрегатор) относится к типу POM и включает в себя несколько дочерних модулей. Когда я пытался затенить uber-jar в этом агрегаторе, он выдавал только POM, но не JAR. Было бы здорово, если бы вы могли дать несколько дополнительных советов? Спасибо - person Adrian Shum; 26.04.2012
comment
@Adrian Shum - Мой лучший совет - прочитать документацию плагина, чтобы убедиться, что вы используете его правильно. maven.apache.org/plugins/maven-shade-plugin Если вы все еще есть проблемы, мне трудно помочь вам без кода/конфигурации. Опубликуйте еще один вопрос, максимально подробно объяснив, чего вы пытаетесь достичь и с какими проблемами сталкиваетесь. Не забудьте включить конфигурацию плагина тени вашего pom. Затем дайте ссылку на вопрос здесь, и я посмотрю, смогу ли я вам помочь. - person Jesse Webb; 27.04.2012
comment
Вы можете использовать конфигурацию outputFile, чтобы заставить агрегатор, упакованный в pom, выводить в виде jar. т.е. ‹выходной файл›target/foo_bar.jar‹/outputFile›. Возможно не поддерживается, но работает - person mlathe; 04.08.2012

Да ! Ты сможешь ! :-)

У Shade есть проблема с реализацией: он не знает, когда работает над проектом pom (не jar или web). Проекты Pom не генерируют бинарные артефакты, затем шейд не находит файлы для слияния, перемещения и т. д., выбрасывая NPE.

Чтобы решить эту проблему, создайте родительский POM из вашего проекта Aggegate-Pom. Внутри него поместите определения оттенков и конфигурацию конфигурации в какой-либо профиль (например, alwaysActiveProfiles) и установите/разверните его с помощью команды:

mvn deploy -P -alwaysActiveProfiles

Эта команда установит этот затененный родитель без запуска плагина тени pom (опция -alwaysActiveProfiles подавляет выполнение плагина тени), и после этого ваши проекты, зависящие от 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>

Remember that your setting.xml must have alwaysActiveProfiles enabled by default, otherwise shade will not run in your dependences shade-pom projects.

person Nemer Daud    schedule 04.01.2011

У меня была такая же проблема с версией 1.6 плагина, я обновился до 2.2 и проблема решилась

person Nuts    schedule 07.03.2014