Maven-Module + Erstellen eines einzelnen spezifischen Moduls

383

Ich habe ein Multi-Modul Maven Projekt mit einem übergeordneten Projekt Pund drei Teilmodulen A, Bund C. Beide Bund Csind Kriegsprojekte und beide hängen davon ab A.

Ich kann geben mvn compilein Prichtig kompiliert alle der Untermodule und haben. Das Problem tritt auf, wenn ich Operationen für bestimmte Module ausführen möchte.

Ich möchte einen Krieg für ein Projekt packen können B, aber wenn ich den Befehl package aus Bdem Verzeichnis ausführe , wird beanstandet, dass die Abhängigkeiten für nicht gefunden werden können A.

Ich verstehe aus dieser Frage: Maven und abhängige Module, dass Maven vielleicht nicht wirklich für diese Art der Abhängigkeitsauflösung ausgelegt ist, aber das wirft die Frage auf, wie ich verpacke B?

  1. Muss ich mvn packagefür die gesamte Projekthierarchie laufen, wenn ich wirklich nur will B?

  2. Muss ich jedes Mal, wenn ich packen möchte, Snapshots von A in meinem lokalen Repository installieren B?

Dieses zweite Szenario macht nicht viel Spaß, wenn Aes sich noch in der aktiven Entwicklung befindet.

Irgendwelche Best Practices hier?

Brian Ferris
quelle
mögliches Duplikat von Maven und abhängigen Modulen
oberlies

Antworten:

694

Irgendwelche Best Practices hier?

Verwenden Sie die Maven fortgeschrittener Reaktor Optionen , genauer gesagt:

-pl, --projects
        Build specified reactor projects instead of all projects
-am, --also-make
        If project list is specified, also build projects required by the list

Also einfach cdin das übergeordnete P-Verzeichnis und ausführen:

mvn install -pl B -am

Und dies wird B und die von B benötigten Module bauen.

Beachten Sie, dass Sie einen Doppelpunkt verwenden müssen, wenn Sie auf einen Doppelpunkt verweisen, artifactIdder vom Verzeichnisnamen abweicht:

mvn install -pl :B -am

Wie hier beschrieben: https://stackoverflow.com/a/26439938/480894

Pascal Thivent
quelle
15
Für alle, die diese Seite im Jahr 2011 besuchen, ist dies die bessere Antwort. Es gibt jetzt eine bessere Unterstützung für Multi-Module in Maven selbst (Maven 2.1 und höher). Sie müssen das Reaktor-Plugin nicht mehr verwenden.
Spedge
17
Eine weitere sehr nützliche Option ist "-amd, --also-make-abhängige", mit der alle Module erstellt werden, die von Projekten in der Reaktorliste abhängen.
Abschrecken
1
Was ist mit dem Bau eines Enkelkindmoduls?
Bax
12
@Bax, verwenden mvn install -pl .,parent/child,parent/child/grandchild Sie Komma verwenden, um mehrere Projekte zu trennen und. für Eltern pom
Neo
1
Wenn ich auf clean packagediese Weise versuche, ein Modul zu erstellen, können Reaktorabhängigkeiten, die noch nicht installiert sind, nicht aufgelöst werden. Damit -amwerden die Deps unnötig neu aufgebaut.
Becken
18

Angenommen, die übergeordnete Datei pom.xml enthält 6 Module und Sie möchten A , B und F ausführen .

<modules>
        <module>A</module>
        <module>B</module>
        <module>C</module>
        <module>D</module>
        <module>E</module>
        <module>F</module>
  </modules>

1- CD in übergeordnetes Projekt

 mvn --projects A,B,F --also-make clean install

ODER

mvn -pl A,B,F -am clean install

ODER

mvn -pl A,B,F -amd clean install

Hinweis: Wenn Sie ein Projekt mit der Option -am angeben , erstellt Maven alle Projekte, von denen das angegebene Projekt abhängt (entweder direkt oder indirekt). Maven überprüft die Liste der Projekte und geht den Abhängigkeitsbaum entlang, um alle Projekte zu finden, die erstellt werden müssen.

Während der Befehl -am alle Projekte erstellt, die für ein bestimmtes Projekt in einem Build mit mehreren Modulen erforderlich sind, konfiguriert die Option -amd oder --also-make-abhängige Elemente Maven so, dass ein Projekt und jedes Projekt erstellt wird, das von diesem Projekt abhängt. Bei Verwendung von --also-make-abhängigen Elementen untersucht Maven alle Projekte in unserem Reaktor, um Projekte zu finden, die von einem bestimmten Projekt abhängen. Diese Projekte werden automatisch erstellt und sonst nichts.

Waqas Ahmed
quelle
8

Maven wurde absolut für diese Art von Abhängigkeit entwickelt.

mvn package installiert nichts in Ihrem lokalen Repository, sondern packt nur das Projekt und belässt es im Zielordner.

Führen Sie mvn installim übergeordneten Projekt (A) alle Submodule im Maven-Repository Ihres Computers aus. Wenn keine Änderungen vorgenommen wurden, müssen Sie nur das Submodul (B) kompilieren / verpacken, und Maven übernimmt das bereits verpackte Modul und installierte Abhängigkeiten genau richtig.

Sie müssen nur ein mvn installim übergeordneten Projekt, wenn Sie einen Teil des Codes aktualisiert haben.

Victor Hugo
quelle
3
Es wäre ein Albtraum während der Entwicklung, wenn Sie eine Korrektur im Untermodul vorgenommen und diese installiert haben und dann den Servlet-Container starten. Das Leben ist kurz :(
hguser
7

Wenn Sie zuvor mvn install für Projekt B ausgeführt haben, wurde es in Ihrem lokalen Repository installiert. Wenn Sie also Paket A erstellen, kann Maven die Abhängigkeit auflösen. Solange Sie Projekt B bei jeder Änderung installieren, sind Ihre Builds für Projekt A auf dem neuesten Stand.

Sie können ein Projekt mit mehreren Modulen mit einem Aggregator-POM definieren, um eine Reihe von Projekten zu erstellen.

Erwähnenswert ist auch m2eclipse . Es integriert Maven in Eclipse und ermöglicht es Ihnen, (optional) Abhängigkeiten vom Arbeitsbereich aufzulösen. Wenn Sie also mehrere Projekte abhacken, wird der Arbeitsbereichsinhalt für die Kompilierung verwendet. Wenn Sie mit Ihren Änderungen zufrieden sind, führen Sie mvn install aus (für jedes Projekt nacheinander oder mithilfe eines Aggregators), um sie in Ihrem lokalen Repository abzulegen.

Reicher Verkäufer
quelle
1
Gibt es eine einfache Möglichkeit, um sicherzustellen, dass alle abhängigen Projekte für mein Zielprojekt installiert wurden? Die Hierarchie, die ich habe, ist tatsächlich viel komplexer als die hier beschriebene. Denken Sie also daran, ob ich mvn install für jedes abhängige Projekt ausgeführt habe, seit ich zuletzt Codeänderungen vorgenommen habe. Dies kann schwierig sein.
Brian Ferris
Ja, wenn Sie Module zum Erstellen der Projektgruppe verwenden, lesen Sie den Link zur ursprünglichen Antwort.
Rich Seller
5

Schauen Sie sich meine Antwort Maven und abhängige Module an .

Das Maven Reactor-Plugin wurde entwickelt, um einen Teil eines Projekts zu erstellen.

Das besondere Ziel, das Sie verwenden möchten reactor:make.

abschrecken
quelle
3
Früher war dies die richtige Antwort, aber mit Maven 2.1 müssen Sie das Reaktor-Plugin nicht mehr verwenden. Schauen Sie sich Pascals Antwort in diesem Thread an, der sich auf "Advanced Reactor Options"
Spedge
3

Sie sagen, Sie "wollen wirklich nur B", aber das ist falsch. Sie möchten B, aber Sie möchten auch ein aktualisiertes A, wenn Änderungen daran vorgenommen wurden ("aktive Entwicklung").

Manchmal möchten Sie also mit A, B und C arbeiten. In diesem Fall haben Sie das Aggregatorprojekt P. Für den Fall, dass Sie mit A und B arbeiten möchten (aber nicht C möchten), sollten Sie das Aggregatorprojekt Q erstellen .

Bearbeiten 2016 : Die oben genannten Informationen waren möglicherweise 2009 relevant. Ab 2016 empfehle ich dringend, dies in den meisten Fällen zu ignorieren und einfach die Befehlszeilenflags -amoder zu -plverwenden, wie in der akzeptierten Antwort beschrieben. Wenn Sie eine Version von maven vor Version 2.1 verwenden, ändern Sie diese zuerst :)

Zac Thompson
quelle
Grmphh ... dann werde ich am Ende so viele Aggregatorprojekte wie Projekte haben.
Kris
@Kris würde ich nicht mehr empfehlen. Ich lasse es hier, falls jemand noch wissen möchte wie, aber ich benutze jetzt immer die Flags -am und -pl. Ich habe meine Antwort aktualisiert.
Zac Thompson