Wie strukturiere ich ein Maven-Projekt mit mehreren Modulen, um es gleichzeitig zu kompilieren?

12

Ich habe ein Maven-Projekt mit mehreren Modulen und Untermodulen, und ich möchte es sofort kompilieren, d. h. mit nur einem Aufruf von "mvn clean install".

Für ein Basisprojekt würde die folgende Struktur funktionieren:

%Vor%

Mit dem Aggregator:

%Vor%

Das Super POM:

%Vor%

POM des Moduls A:

%Vor%

Modul B ist ähnlich.

Wenn der Befehl "mvn clean install" im Hauptverzeichnis des Projekts ausgeführt wird, wird nach dem Bereinigen des Ordners .m2 / repository Folgendes angezeigt:

%Vor%

Wenn ich jetzt etwas, das komplexer ist (aber immer noch mit einem Super-POM), wie zum Beispiel:

%Vor%

Das Wurzel-POM ist:

%Vor%

Lib1 POM:

%Vor%

Und zum Beispiel moduleA1 POM:

%Vor%

Maven schafft es nicht, die POM-Dateien aufzulösen (nachdem der Ordner .m2 / repository aufgeräumt wurde):

%Vor%

Ich muss zuerst den Superpom bauen:

%Vor%

Und nur dann wird es kompilieren:

%Vor%

Wie würden Sie das Projekt so strukturieren, dass es ohne diese zweistufige Übersetzung funktioniert?

[EDIT]: Wie in den Kommentaren besprochen, würde das Hinzufügen des relativen Pfades des Super POM zu den Modulen POMs den Code mit einer Befehlszeile kompilieren lassen.

Wenn ich jedoch nur lib1 an einige Entwickler verteilen möchte, obwohl sich mein super POM in einem Maven-Repository befindet, würde lib1 nicht ohne die gesamte Projektstruktur kompilieren. Dies macht das Projekt weniger modular.

    
Ben 27.01.2016, 10:18
quelle

1 Antwort

14

Lass mich anfangen, wie du es getan hast, aber ich benenne die Dinge ein bisschen anders:

%Vor%

Beginnen wir mit dem project-root , das wie folgt aussehen wird:

%Vor%

Das module parent wird so aussehen. Ich betone, dass dies nur den Verweis auf moduleA und moduleB enthält und erben von project-root :

%Vor%

moduleA wird so aussehen. Achten Sie darauf, dass dies erben von module-parent (Eltern), was genau eine Ebene darüber ist ...

%Vor%

Wenn Sie diese Art von Struktur verwenden, können Sie einfach zum project-root level gehen und tun:

%Vor%

Außerdem können Sie danach folgende Dinge verwenden:

%Vor%

... um nur modulA zu bauen (aber bleib bei project-root level ...).

module-parent könnte in diesem Beispiel wie verschwendet oder überflüssig aussehen, aber wenn Sie mehr Module erhalten, können Sie zusätzliche Abhängigkeiten über dependencyManagement definieren oder können Pluginkonfigurationen über pluginManagement ändern, die nur in diesem Unterbereich verwendet werden (ModulA, ModulB, ...). Wenn Ihr Projekt größer wird, werden Sie mehr Modul-Eltern parallel bekommen, die verschiedene Teile Ihrer Anwendungen enthalten ... und verschiedene Absichten, die mit dieser Struktur erreicht werden können.

Noch etwas zu erwähnen. Ich habe die groupId von org.test zu org.test.module im Modul-Eltern geändert. Dies ist manchmal nützlich, wenn Sie eine große Anzahl von Modulen haben, weil groupId die Ordnerstruktur in Ihrem Repository darstellt (wie es Java-Pakete in einem Java-Projekt tun) ... damit Sie einen besseren Überblick haben ...

Der project-root ist der Ort, an dem die insgesamt nutzbaren Abhängigkeiten über dependencyManagement etc .... und die verwendeten Plugins definiert werden, die über pluginManagement ... definiert werden sollen, oder mit maven-enforcer-plugin um die allgemeinen Projektregeln zu definieren ...

Typische Szenarien für diese Art von Struktur sind Java EE-Projekte oder andere große Projekte (vielleicht mit 300 ... oder 1000 Modulen, ja, sie existieren) ...

Wenn Sie mehr Module erhalten, können Sie die Multi-Thread-Fähigkeit von maven verwenden und Ihr Projekt mit:

erstellen %Vor%

von project-root , was die Erstellungszeit drastisch reduziert.

    
khmarbaise 28.01.2016, 09:42
quelle

Tags und Links