2010-06-30 4 views
12

У меня есть сценарий, в котором мне нужно создать банку uber мультимодульного проекта maven, включая все модули и их зависимости. Я пробовал использовать плагин maven shade. но, похоже, это работает только тогда, когда я использую его на уровне модуля. Если добавить запись плагина в родительском П затем на сборки перерывов (он пытается оттенить родительский POM)Использование плагина Maven shade в проекте с несколькими модулями - NullPointerException

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

+0

Вероятная обходной путь: создать Maven проект с зависимостями для отдельных баночках модуля и использовать шейдер плагин на этом проекте – Manoj

+2

Невероятно, это правильное решение. –

ответ

13

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

Здесь documentation объясняет отношения POM и разницу между агрегацией и наследованием.

+0

Я столкнулся с подобной проблемой и нашел этот ответ. Однако у меня есть структура проекта точно так же, как описано вами, но она не работает. Мой проект верхнего уровня (агрегатор) имеет тип POM и включает в себя несколько дочерних модулей. Когда я пытался затенять uber-jar в этом агрегаторе, он выдавал только POM, но не JAR. Будет здорово, если вы сможете дать дополнительные подсказки? Спасибо –

+0

@Adrian Shum - Мой лучший совет - прочитать документацию плагина, чтобы убедиться, что ваше использование правильное. Http: //maven.apache.org/plugins/maven-shade-plugin/Если у вас все еще есть проблемы, мне сложно помочь вам без кода/config. Отправьте еще один вопрос с максимально подробными сведениями, объясняющими, что вы пытаетесь выполнить, и с какими проблемами вы сталкиваетесь. Не забудьте включить конфигурацию shade-plugin вашего pom. Затем перейдите на этот вопрос, и я увижу, могу ли я помочь вам. –

+0

Вы можете использовать конфигурацию outputFile, чтобы заставить агрегат, упакованный в pom, выводиться как банку. т.е. target/foo_bar.jar. Возможно, не поддерживается, но работает – mlathe

3

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

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

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

МВН развернуть -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 включен по умолчанию, в противном случае тень не будет работать в ваших зависимости тени-POM проекты.

2

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

Смежные вопросы