2010-06-30 13 views
12

Mam scenariusz, w którym potrzebuję utworzyć słoik wielowątkowego projektu obejmującego wszystkie moduły i ich zależności. Próbowałem używać wtyczki maven shade. ale wydaje się działać tylko wtedy, gdy używam go na poziomie modułu. Jeśli dodać wpis wtyczek w macierzystej pom następnie przerwy kompilacji (próbuje osłonić pom nadrzędnej)Używanie wtyczki Maven shade w projekcie wielomodułowym - 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] 

to wydaje się mieć sens, ponieważ <packaging> dla projektu maven rodzic jest pom. Ale powinien istnieć jakiś sposób na stworzenie słoika uber dla projektu wielomodułowego ... Wszelkie pomysły ludzi ???

+0

Prawdopodobna obejście: tworzenia projektu maven z zależnościami dla poszczególnych słoików modułowych i użyć wtyczki shaderów w tym projekcie – Manoj

+2

Nieprawdopodobne, to poprawne rozwiązanie. –

Odpowiedz

13

Nie powinieneś używać pliku POM twojego rodzica do próbowania cieniowania; powinieneś używać do tego oddzielnego projektu agregatora. Projekty dziedzinowe są używane do dziedziczenia, podczas gdy projekty agregatora są używane do wykonywania funkcji zagregowanych w ramach grupy podprojektów; jak cieniowanie swoich JARów w słoik uber. Ten projekt byłby po prostu plikiem pom w katalogu głównym projektu (tym samym poziomie co wszystkie foldery podmodułów), który odwołuje się do podprojektów i ma konfigurację wtyczki koloru. Upewnij się, że packa określona dla tej POM to JAR.

Oto documentation wyjaśniający relacje POM i różnicę między Agregacją a dziedziczeniem.

+0

Natknąłem się na podobny problem i znalazłem tę odpowiedź. Mam jednak strukturę projektu dokładnie tak, jak opisałeś, ale nie działa. Mój projekt na najwyższym poziomie (agregator) jest typu POM i zawiera kilka modułów potomnych. Kiedy próbowałem zaciągnąć uber-jar w tym agregatorze, daje to tylko POM, ale nie JAR. Będzie świetnie, jeśli możesz podać dodatkowe wskazówki? Dzięki –

+0

@Adrian Shum - Moja najlepsza rada to przeczytać dokumentację wtyczki, aby upewnić się, że korzystanie z niej jest właściwe. http: //maven.apache.org/plugins/maven-shade-plugin/Jeśli nadal masz problemy, trudno mi ci pomóc bez żadnego kodu/config. Napisz kolejne pytanie z jak największą ilością szczegółów, wyjaśniając, co próbujesz osiągnąć i jakie problemy napotykasz. Nie zapomnij dołączyć swojej wtyczki pom's shade-plugin config. Następnie link do pytania tutaj, a ja zobaczę, czy mogę ci pomóc. –

+0

Możesz użyć opcji outputFile config, aby wymusić agregator pom w celu wysłania go jako słoik. tj. target/foo_bar.jar. Prawdopodobnie nie jest obsługiwane, ale działa – mlathe

3

Tak! Możesz ! :-)

Shade ma problem z implementacją: nie wiadomo, kiedy jest uruchomiony projekt pom (nie jar lub web). Projekty pom nie generują artefaktów binarnych, a następnie cień nie znajduje plików do scalenia, przeniesienia itp., Rzucając NPE.

Aby rozwiązać ten problem, utwórz macierzystego POM z projektu agegate-Pom. Wewnątrz niej umieścić definicje cieniu i konfiguracją konfigurowanie do pewnego profilu (np alwaysActiveProfiles.) Oraz instalacji/wdrożyć go za pomocą komendy:

mvn wdrożyć -P -alwaysActiveProfiles

To polecenie zainstaluje ten zacieniony rodzic bez działającej wtyczki cienia pom (-alwaysActiveProfiles opcja wyłączania wtyczki cienia) i po tym, twoje projekty zależne od maven będą działały. Twój cieniowane rodzic pom może wyglądać następująco:

<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> 

Pamiętaj, że setting.xml musi mieć alwaysActiveProfiles domyślnie włączona, inaczej cień nie będzie działać w swoich uzależnień projektów cień-pom.

2

miałem ten sam problem z wersji 1.6 wtyczki, zaktualizowałem do 2.2 i problem został rozwiązany

Powiązane problemy