Использование плагина Maven Shade в многомодульном проекте - NullPointerException - PullRequest
12 голосов
/ 30 июня 2010

У меня есть сценарий, в котором мне нужно создать 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 для многомодульного проекта ... Есть идеи, люди ???

Ответы [ 3 ]

13 голосов
/ 05 июля 2010

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

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

3 голосов
/ 04 января 2011

Да! Вы можете ! : -)

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

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

mvn deploy -P-всегда-ActiveProfiles

Эта команда установит этого затененного родителя без запуска плагина шейдера 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 зависимостей.

2 голосов
/ 07 марта 2014

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

...