Verwalten von multi-Modul-Abhängigkeiten mit dem Maven assembly plugin
Ich benutze Maven-assembly-plugin, um eine Montage für meine multi-Modul-Projekt. Es sind zwei separate Anwendungen, die von diesem multi-Modul-Projekt, die jeweils einen separaten Satz von Abhängigkeiten. Ich machte eine benutzerdefinierte assembly-descriptor, die dort zwei Verzeichnisse (für jede Anwendung) mit Modul baut und Ihre jeweiligen Abhängigkeiten. Es funktioniert auch alles einwandfrei, aber eine Sache - es stellt Abhängigkeiten für beide Module an der jeweils anderen Baugruppe.
Folgende ist eine vereinfachte version von meinem Projekt, mit genau dem gleichen Verhalten.
Überlegen, ein Projekt bestehend aus zwei Modulen und einer assembly-Modul:
APP
module1
module2
assembly
Habe ich Hinzugefügt, Abhängigkeiten rein zur demonstration:
com.test.app:module1:jar:1.0
\- commons-cli:commons-cli:jar:1.2:compile
com.test.app:module2:jar:1.0
\- commons-daemon:commons-daemon:jar:1.0.8:compile
Hier ist die parent-POM:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.test</groupId>
<artifactId>app</artifactId>
<version>1.0</version>
<packaging>pom</packaging>
<modules>
<module>module1</module>
<module>module2</module>
<module>assembly</module>
</modules>
</project>
module1 POM:
<project>
<parent>
<groupId>com.test</groupId>
<artifactId>app</artifactId>
<version>1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.test.app</groupId>
<artifactId>module1</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>commons-cli</groupId>
<artifactId>commons-cli</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
</project>
"Modul2" POM:
<project>
<parent>
<groupId>com.test</groupId>
<artifactId>app</artifactId>
<version>1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.test.app</groupId>
<artifactId>module2</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>commons-daemon</groupId>
<artifactId>commons-daemon</artifactId>
<version>1.0.8</version>
</dependency>
</dependencies>
</project>
Montage POM:
<project>
<parent>
<groupId>com.test</groupId>
<artifactId>app</artifactId>
<version>1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.test.app</groupId>
<artifactId>assembly</artifactId>
<version>1.0</version>
<packaging>pom</packaging>
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2.2</version>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
<configuration>
<appendAssemblyId>false</appendAssemblyId>
<descriptors>
<descriptor>src/main/assembly/descriptor.xml</descriptor>
</descriptors>
</configuration>
</plugin>
</plugins>
</build>
</project>
Und schließlich die assembly-descriptor:
<assembly>
<id>distribution</id>
<includeBaseDirectory>false</includeBaseDirectory>
<formats>
<format>dir</format>
</formats>
<moduleSets>
<moduleSet>
<useAllReactorProjects>true</useAllReactorProjects>
<includes>
<include>com.test.app:module1:jar</include>
</includes>
<binaries>
<outputDirectory>module1</outputDirectory>
<unpack>false</unpack>
<dependencySets>
<dependencySet>
<unpack>false</unpack>
</dependencySet>
</dependencySets>
</binaries>
</moduleSet>
<moduleSet>
<useAllReactorProjects>true</useAllReactorProjects>
<includes>
<include>com.test.app:module2:jar</include>
</includes>
<binaries>
<outputDirectory>module2</outputDirectory>
<unpack>false</unpack>
<dependencySets>
<dependencySet>
<unpack>false</unpack>
</dependencySet>
</dependencySets>
</binaries>
</moduleSet>
</moduleSets>
</assembly>
Wie Sie sehen können, der Montage ist die Bindung zum Paket-phase. Also, wenn ich ausführen
mvn package
vom übergeordneten Verzeichnis habe ich folgende Montage
module1/
commons-cli-1.2.jar
commons-daemon-1.0.8.jar
module1-1.0.jar
module2/
commons-cli-1.2.jar
commons-daemon-1.0.8.jar
module2-1.0.jar
Im Grunde ist hier das problem, dass module1 hängt nicht von commons-daemon, aber die assembly-plugin integriert hat, die Abhängigkeit. Ähnlich ist es mit "Modul2" und " commons-cli.
Kann jemand erklären, warum die assembly-plugin auf diese Weise verhält?
Einer was wäre eine Lösung?
- Ich würde nicht erwarten, dass dieses seltsame Verhalten von
maven-assembly-plugin
... Bist du sicher, dass es keine Abhängigkeiten gibt, geschoben, um zu Ihrer assembly-Projekt von den Eltern? Zeigen Sie uns die "dependency tree" generiert für Montage-Projekt. - Abhängigkeit Baum für Montage-Modul ist offensichtlich leer, denn seine POM hat keine Abhängigkeit Erklärungen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich hatte schon immer ähnliche Erfahrungen mit dem assembly-plugin mit multi-module-Projekten, wo das Endergebnis nicht das war, was ich erwartet hatte. Ich hoffe, jemand anderes kann eine genauere Antwort auf die Frage, warum das passiert und wie man am besten für die Verwendung dieser beiden Begriffe im tandem.
Sagte, ein möglicher work-around wäre es, Modul1 und Modul2 generieren Ihre eigenen Montage-Artefakte enthalten, die Ihre jeweiligen Gläser und Abhängigkeiten. Dann können Sie ändern Sie die Baugruppe sub-Modul pom-Datei-Abhängigkeiten auf die generierte Verteilung der Artefakte aus seinem Geschwister Module und dann packen Sie diese in eine neue Baugruppe.
In beiden Modul1 und Modul2 pom-Dateien, die Sie hinzufügen können, eine assembly plugin-Konfiguration, um Ihr Paket phase viel, wie Sie es mit der Montage sub-Modul.
Module1 hätte src/main/assembly/descriptor.xml wie diese
Und Modul2 wird eine ähnliche src/main/assembly/descriptor.xml
Dann in der assembly/pom.xml fügen Sie das Modul 1 und 2 zip-Artefakte als Abhängigkeiten
...und trim die assembly/src/main/assembly/descriptor.xml Datei wie folgt Aussehen
Wie ich schon sagte, dies wäre eine mögliche Arbeit um und leider fügt eine erhebliche Menge an zusätzlichen XML-Konfiguration, um Ihren build-Prozess. Aber es funktioniert.
mvn package
von parent-POM, das wäre es erstmal montieren module1, dann module2 und Verpackung-Montage-Modul würde nur die ersten zwei Baugruppen zusammen. Dies jedoch verschlingt der Zweck einer separaten assembly-Modul. Die Idee hinter der ein separates Modul für eine Montage ist darauf zu achten, dass alle Module gebaut worden, wenn die assembly erstellt wird.<type>
und<classifier>
in der Montage pom aufgehört, meine Gläser und Ihre Abhängigkeiten zu bekommen ausgepackt. Danke 🙂