2009-10-05 11 views
27

Mam projekt, w którym próbuję utworzyć dystrybucyjny plik zip, który zawiera (między innymi plikami) plik wykonywalny z zależnościami mojego projektu java.Wtyczka maven-assembly - jak tworzyć zagnieżdżone złożenia

Więc rodzaju ma to wyglądać tak:

-wiki-search-1.0.0-dist.zip 
    -wiki-search.bat 
    -wiki-search-help.html 
    -wiki-search-1.0.0-jar-with-dependencies.jar 
     -jar content... 

Używam plugin montaż oraz predefiniowane deskryptor „Jar-z zależnościami”, aby utworzyć mój plik wykonywalny jar.

Podajemy osobny wpis wtyczki zespołu w moim pom, odwołując się do deskryptora niestandardowego, aby spróbować skompilować dystrybuowalny plik zip.

więc częścią mojego pom wygląda następująco:

<plugin> 
<artifactId>maven-assembly-plugin</artifactId> 
<configuration> 
    <descriptorRefs> 
    <descriptorRef>jar-with-dependencies</descriptorRef> 
    </descriptorRefs> 
    <archive> 
    <manifest> 
    <mainClass>quicksearch.QuickSearchApp</mainClass> 
    </manifest> 
    </archive> 
</configuration> 
<executions> 
    <execution> 
    <id>make-assembly</id> 
    <phase>package</phase> 
    <goals> 
    <goal>attached</goal> 
    </goals> 
    </execution> 
</executions> 
</plugin> 
<plugin> 
<artifactId>maven-assembly-plugin</artifactId> 
<configuration> 
    <descriptors> 
    <descriptor>src/main/assembly/dist.xml</descriptor> 
    </descriptors> 
</configuration> 
<executions> 
    <execution> 
    <id>make-assembly</id> 
    <phase>package</phase> 
    <goals> 
    <goal>attached</goal> 
    </goals> 
    </execution> 
</executions> 
</plugin> 

A mój zwyczaj deskryptor wygląda następująco:

<assembly> 
    <id>dist</id> 
    <formats> 
    <format>tar.gz</format> 
    <format>tar.bz2</format> 
    <format>zip</format> 
    </formats> 
    <fileSets> 
    <fileSet> 
     <includes> 
     <include>${project.basedir}/target/wiki-search-0.0.1-SNAPSHOT-jar-with-dependencies.jar</include> 
     </includes> 
     <outputDirectory>.</outputDirectory> 
    </fileSet> 
    <fileSet> 
     <directory>${project.basedir}/src/main/etc</directory> 
     <includes> 
     <include>*</include> 
     </includes> 
    <outputDirectory></outputDirectory> 
    </fileSet> 
    </fileSets> 
</assembly> 

Wszystko działa poprawnie. Tworzone są słoiki zależne. Tworzony jest mój dist plik ZIP. Plik dist zip nie zawiera pliku jar-with-dependencies.

Odpowiedz

43

Przy istniejącej konfiguracji dwie oddzielne konfiguracje wtyczki zespołu zostaną scalone, a konfiguracje również zostaną scalone.

Aby osiągnąć swój cel, należy zdefiniować pojedynczą konfigurację wtyczki zespołu z wieloma zagnieżdżonymi wykonaniami, a następnie zdefiniować konfigurację dla każdego wykonania w niej. Wtyczka zespołu wykona następnie kolejno każdy zestaw, więc słoik jar-with-dependencies będzie dostępny do umieszczenia w słoju dist. Zwróć też uwagę, że cel attached jest przestarzały na korzyść bramki single.

Należy również zauważyć, że ścieżki w zespole są względne w stosunku do katalogu głównego, a do określonego pliku należy użyć elementu <files>, a nie elementu <filesets>. Można także określić właściwości w złożeniu, aby zmiana była mniej delikatna.

przegrupowanego konfiguracja i montaż poniżej powinien robić to, co jesteś po:

deskryptor Montaż:

<assembly> 
    <id>dist</id> 
    <formats> 
    <format>tar.gz</format> 
    <format>tar.bz2</format> 
    <format>zip</format> 
    </formats> 
    <files> 
    <file> 
     <source> 
     target/${project.artifactId}-${project.version}-jar-with-dependencies.jar 
     </source> 
     <outputDirectory>/</outputDirectory> 
    </file> 
    </files> 
    <fileSets> 
    <fileSet> 
     <directory>${project.basedir}/src/main/resources</directory> 
     <includes> 
     <include>*</include> 
     </includes> 
    <outputDirectory>/</outputDirectory> 
    </fileSet> 
    </fileSets> 
</assembly> 

Wtyczka Montaż:

<plugin> 
<artifactId>maven-assembly-plugin</artifactId> 
<executions> 
    <execution> 
    <id>jar-with-dependencies</id> 
    <phase>package</phase> 
    <goals> 
    <goal>single</goal> 
    </goals> 
    <configuration> 
    <descriptorRefs> 
    <descriptorRef>jar-with-dependencies</descriptorRef> 
    </descriptorRefs> 
    <archive> 
    <manifest> 
     <mainClass>quicksearch.QuickSearchApp</mainClass> 
    </manifest> 
    </archive> 
    </configuration> 
    </execution> 
    <execution> 
    <id>dist</id> 
    <phase>package</phase> 
    <goals> 
    <goal>single</goal> 
    </goals> 
    <configuration> 
    <descriptors> 
    <descriptor>src/main/assembly/dist.xml</descriptor> 
    </descriptors> 
    </configuration> 
    </execution> 
</executions> 
</plugin> 
+3

+1 bardzo ładne i szczegółowy odpowiedź –

+0

Legend . Pracował po raz pierwszy. Twoje zdrowie. – Ben

+0

Dzięki! Czy istnieje sposób, aby to osiągnąć, nie przypisując wykonania do domyślnego cyklu życia? Pominięcie elementów "fazy" i "celów" nie działa dla mnie. –

0

Masz dwie różne konfiguracje dla wtyczki zespołu i chcesz, aby były uruchamiane w kolejności (słoik przed zip), ale nie sądzę, aby Maven implikował jakąkolwiek kolejność w jaki sposób zostanie to rozwiązane. Domyślam się, że plik zip jest generowany przed plikiem JAR.

Nawet jeśli tak nie jest, sugeruję utworzenie jednego modułu na artefakt. Przenieś zespół JAR do własnego modułu i od niego zależą teraz tylko moduł Zip. W ten sposób rozdzielczość rozkazów Mavena może się rozpaść i zbudować je w odpowiedniej kolejności.