Multimodul-Projekt mit Maven

1. Übersicht

In diesem Tutorial zeigen wir, wie Sie mit Maven ein Projekt mit mehreren Modulen erstellen.

Zunächst werden wir diskutieren, was ein Projekt mit mehreren Modulen ist, und die Vorteile dieses Ansatzes untersuchen. Dann richten wir unser Beispielprojekt ein. Eine gute Einführung in Maven finden Sie in diesem Tutorial.

2. Mavens Multi-Modul-Projekt

Ein Projekt mit mehreren Modulen wird aus einem Aggregator-POM erstellt, das eine Gruppe von Submodulen verwaltet. In den meisten Fällen befindet sich der Aggregator im Stammverzeichnis des Projekts und muss über eine Verpackung vom Typ pom verfügen .

Jetzt sind die Submodule reguläre Maven-Projekte und können separat oder über den Aggregator POM erstellt werden.

Wenn Sie das Projekt über den Aggregator POM erstellen, führt jedes Projekt mit einem anderen Verpackungstyp als pom zu einer erstellten Archivdatei.

3. Vorteile der Verwendung von Multi-Modulen

Der wesentliche Vorteil dieses Ansatzes besteht darin, dass wir Doppelarbeit reduzieren können.

Angenommen, wir haben eine Anwendung, die aus mehreren Modulen besteht. Es handelt sich um ein Front-End-Modul und ein Back-End-Modul. Jetzt arbeiten wir an beiden und ändern die Funktionalität, die sich auf beide auswirkt. In diesem Fall müssen wir ohne ein spezielles Build-Tool beide Komponenten separat erstellen oder ein Skript schreiben, das den Code kompiliert, Tests ausführt und die Ergebnisse anzeigt. Nachdem wir noch mehr Module im Projekt haben, wird es schwieriger, sie zu verwalten und zu warten.

Außerdem benötigen Projekte in der realen Welt möglicherweise bestimmte Maven-Plugins, um verschiedene Vorgänge während des Build-Lebenszyklus auszuführen, Abhängigkeiten und Profile gemeinsam zu nutzen oder andere Stücklistenprojekte einzuschließen.

Wenn wir mehrere Module nutzen, können wir daher die Module unserer Anwendung in einem einzigen Befehl erstellen. Wenn die Reihenfolge wichtig ist, wird Maven dies für uns herausfinden. Wir können auch eine große Menge an Konfiguration mit anderen Modulen teilen .

4. Übergeordnetes POM

Maven unterstützt die Vererbung so, dass jede pom.xml-Datei das implizite übergeordnete POM hat, Super POM heißt und sich in den Maven-Binärdateien befindet. Diese beiden Dateien werden von Maven zusammengeführt und bilden das effektive POM.

Daher können wir unsere eigene pom.xml-Datei erstellen, die uns als übergeordnetes Projekt dient . Dann können wir dort alle Konfigurationen mit Abhängigkeiten einschließen und diese als übergeordnetes Element unserer untergeordneten Module festlegen, damit sie davon erben.

Neben der Vererbung liefert Maven den Begriff der Aggregation. Das übergeordnete POM, das diese Funktionalität nutzt, wird als aggregiertes POM bezeichnet . Grundsätzlich deklariert diese Art von POM seine Module explizit in der Datei pom.xml.

5. Submodule

Submodule oder Subprojekte sind reguläre Maven-Projekte, die vom übergeordneten POM erben. Wie wir bereits wissen, können wir durch Vererbung die Konfiguration und Abhängigkeiten mit Submodulen teilen. Wenn wir jedoch unser Projekt auf einmal erstellen oder veröffentlichen möchten, müssen wir unsere Submodule explizit im übergeordneten POM deklarieren. Letztendlich wird unser übergeordnetes POM sowohl das übergeordnete als auch das aggregierte POM sein.

6. Erstellen der Anwendung

Nachdem wir die Submodule und Hierarchien von Maven verstanden haben, erstellen wir eine Beispielanwendung, um sie zu demonstrieren. Wir werden die Befehlszeilenschnittstelle von Maven verwenden, um unsere Projekte zu generieren.

Diese App wird aus drei Modulen bestehen, die Folgendes darstellen:

  • Der Kern unserer Domain
  • Ein Webdienst , der einige REST-APIs bereitstellt
  • Eine Webanwendung, die benutzerbezogene Webressets enthält

Da wir uns auf Maven konzentrieren, bleibt die Implementierung dieser Dienste undefiniert.

6.1. Übergeordnetes POM generieren

Lassen Sie uns zunächst ein übergeordnetes Projekt erstellen :

mvn archetype:generate -DgroupId=org.baeldung -DartifactId=parent-project

Sobald das übergeordnete Element generiert wurde, müssen wir die Datei pom.xml im Verzeichnis des übergeordneten Elements öffnen und die Verpackung in pom ändern.

pom

Indem Sie die Verpackung auf den POM-Typ setzen, erklären wir, dass das Projekt als übergeordnetes Element oder Aggregator dient und keine weiteren Artefakte erzeugt.

Jetzt, da unser Aggregator fertig ist, können wir unsere Submodule generieren.

Wir müssen jedoch beachten, dass sich hier die gesamte freizugebende Konfiguration befindet und schließlich in untergeordneten Modulen wiederverwendet wird. Unter anderem können wir hier dependencyManagement oder pluginManagement verwenden .

6.2. Submodule erstellen

Da unser übergeordnetes POM als übergeordnetes Projekt bezeichnet wurde , müssen wir sicherstellen, dass wir uns im übergeordneten Verzeichnis befinden, und Generierungsbefehle ausführen:

cd parent-project mvn archetype:generate -DgroupId=org.baeldung -DartifactId=core mvn archetype:generate -DgroupId=org.baeldung -DartifactId=service mvn archetype:generate -DgroupId=org.baeldung -DartifactId=webapp

Beachten Sie den verwendeten Befehl. Es ist dasselbe, das wir für die Eltern verwendet haben. Die Sache hier ist, dass diese Module reguläre Maven-Projekte sind, aber Maven hat erkannt, dass sie verschachtelt sind. Als wir das Verzeichnis in das übergeordnete Projekt geändert haben, haben wir festgestellt, dass das übergeordnete Verzeichnis vom Typ pom ist, und beide pom.xml- Dateien entsprechend geändert .

Danach generiert Maven drei Submodule und ändert für uns die pom.xml- Datei der Eltern, indem einige Tags hinzugefügt werden:

 core service webapp 

Jetzt deklariert unser Elternteil explizit aggregierte Module.

Wenn Sie als nächstes den Befehl mvn package im übergeordneten Projektverzeichnis ausführen, erstellt und testet Maven alle drei Module.

Moreover, Maven Reactor will analyze our project and build it in proper order. So, if our webapp module depends on the service module, Maven will build first the service, then the webapp.

After all, if we wish to share all the configuration with our submodules, in their pom.xml files, we'll have to declare the parent:

 org.baeldung parent-project 1.0-SNAPSHOT 

We need to note, that submodules can have only one parent. However, we can import many BOMs. More details about the BOM files can be found in this article.

6.3. Building the Project

Now we can build all three modules at once. In the parent's project directory, run:

mvn package

This will build all the modules, we should see the following output of the command:

[INFO] Scanning for projects... [INFO] ------------------------------------------------------------------------ [INFO] Reactor Build Order: [INFO] parent-project [INFO] core [INFO] service [INFO] webapp ... [INFO] Reactor Summary: [INFO] parent-project ..................................... SUCCESS [ 0.140 s] [INFO] core ............................................... SUCCESS [ 2.195 s] [INFO] service ............................................ SUCCESS [ 0.767 s] [INFO] webapp ............................................. SUCCESS [ 0.572 s] [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------

The Reactor lists the parent-project, but as it's pom type it's excluded and the build results in three separate .jar files for all other modules. In that case, build occurs in three of them.

7. Conclusion

In this tutorial, we discussed the benefits of using Maven multi-modules. Also, we distinguished between regular Maven's parent POM and aggregate POM. In the end, we showed how to set up a simple multi-module to start to play with.

Maven is a great tool but it is complex on its own. If you'd like to find more details about Maven, have a look at the Sonatype Maven reference or Apache Maven guides. If you seek advanced usages of Maven multi-modules set up, have a look how Spring Boot project leverages the usage of it.

Alle Codebeispiele in Baeldung wurden mit Maven erstellt, sodass Sie auf unserer GitHub-Projektwebsite problemlos verschiedene Maven-Konfigurationen anzeigen können.