Multi Module Maven Project
Ein Projekt mit einigem Umfang an Funktionalität kann schnelle eine grosse Codebasis bedeuteten.
Es wird wichtig, das Projekt zu strukturieren, Teile des Codes zu isolieren und in Module zu organisieren.
Damit wird es einfacher, den Code zu verstehen, zu warten und zu testen.
Ein Ansatz dies zu tun kann sein, ein Multi-Modul-Maven-Projekte aufzubauen.
Guides im Internet:
Diese Guides erklären das Konzept der Multi Module Maven Projekte.
Und zeigen auch praktische Beispiele. Allerdings haben diese oft eine gewisse Komplexität.
Deshalb habe ich weiter unten ein eigenes Beispiel zusammengestellt.
-
Ein Guide der aus meiner Sicht das Prinzip gut erklärt. https://medium.com/%40khileshsahu2007/maven-multi-module-project-guide-structure-examples-real-world-challenges-d867ff22a0a8
-
Ein Guide der Passwörter verschieden Hashed. Besteht aus vielen Teilmodulen https://mkyong.com/maven/maven-how-to-create-a-multi-module-project/
-
Der Guide von Maven selber / Etwas alte Java Versionen... https://www.sonatype.com/resources/guides/maven-by-example/multi-module-project
-
Ein überschaubarer Blog von Baeldung, der sich sehr auf Maven konzentriert https://www.baeldung.com/maven-multi-module
Das Prinziep eines Multi-Modul-Maven-Projektes anhand eines Beispiels erklärt.
Schritt 1 Parent Projekt erstellen
Das ist das Parent Projekt, dass die Module organisiert und die gemeinsamen Einstellungen enthält. Es hat keine eigene Funktionalität, sondern dient als Container für die Module.
Erstellen Sie mit IntelliJ ein neues Java Projekt.
- Projektname:
multimoduleproject - Build-System: Maven
- ohne Sample Code
- GroupId: ch.bbw.pr.multimodulemaven
- ArtifactId: multimoduleproject
- Version: 1.0-SNAPSHOT
Es entsteht diese Struktur:
Schritt 2 app-main Projekt erstellen
Das ist das Hauptmodul, dass die main Methode enthält und die Anwendung startet. Es soll später von anderen Modulen abhängen, um Funktionalität zu nutzen.
Erstellen Sie in Ihrem Projekt aus Schritt 1 ein neues Maven Modul app-main.
-> File -> New -> Module -> Maven
- Projektname:
app-main - Add Sample Code: Ja
- GroupId: ch.bbw.pr.multimodulemaven
- ArtifactId: app-main
- Version: 1.0-SNAPSHOT
Es entsteht diese Struktur:
Starten Sie die main Methode von app-main und schauen Sie, dass die Ausgabe auf der Konsole funktioniert.
Schritt 3 greeter-lib Module
Dieses Modul soll später von der app-main verwendet werden, um einen Text zu generieren, der dann in der main Methode ausgegeben wird.
Erstellen Sie zunächst im Parent Projekt einen Unterordner submodules.
Struktur:
- multimodulemaven
- .idea
- .mvn
- app-main
- src
- pom.xml
- src
- submodules
- .gitignore
- pom.xml
Erstellen Sie in Ihrem im Parent Projekt ein neues Maven Modul greeter-lib.
-> File -> New -> Module -> Maven
WICHTIG: Das Verzeichnis des Moduls greeter-lib soll sich im Unterordner submodules befinden
-> multimodulemaven/submodules/greeter-lib
- Projektname:
greeter-lib - Add Sample Code: nein
- GroupId: ch.bbw.pr.multimodulemaven
- ArtifactId: greeter-lib
- Version: 1.0-SNAPSHOT
Struktur:
- multimodulemaven
- .idea
- .mvn
- app-main
- src
- pom.xml
- src
- submodules
- greeter-lib
- src
- pom.xml
- .gitignore
- pom.xml
Erstellen Sie in der greeter-lib eine neue Klasse Greeter im package ch.bbw.pr.greeter.
Implementieren Sie in der Klasse eine Methode public String greet(String name).
Die Methode gibt einen Begrüssungstext + name zurückgibt, zBsp. "Hello, " + name + "!".
Diese Methode kann man jetzt noch nicht ausführen.
Schritt 4 Abhängigkeit von greeter-lib in main-app implementieren
Die main Methode muss die Methode greet der Greeter Klasse aufrufen und den Rückgabewert auf der Konsole ausgeben.
Wenn man die Zeile implementiert, dann erscheint zunächste eine Fehlermeldung.
Doch IntelliJ bietet an, die fehlende Dependency zu ergänzen. Lassen Sie IntelliJ das tun.
Im Main.java wird automatisch hinzugefügt:
Und im pom.xml von app-main wird die Dependency hinzugefügt:
Noch lässt sich die main-Methode nicht ausführen.
Wir müssen die pom.xml noch bereinigen und dafür Sorgen, dass Module nicht von IntelliJ sondern von Maven verwaltet werden.
Schritt 5 Module bereinigen
In der pom.xml des Parent Projektes hat einen guten Stand.
Es definiert die Module und die gemeinsamen Einstellungen. Es muss nichts geändert werden.
In der pom.xml von app-main muss dies verändert werden:
- Entfernen der Properties, denn diese werden vom Parent-Projekt übernommen.
- Unter der
artefactIddaspackagingundnamehinzufügen
In der pom.xml von greeter-lib muss dies verändert werden:
- Entfernen der Properties, denn diese werden vom Parent-Projekt übernommen.
- Unter der
artefactIddaspackagingundnamehinzufügen
Schritt 6 Projekt bauen und ausführen
Funktioniert das Projekt nun wenn man es ganz neu öffnet?
Und davor alle IntelliJ spezifischen Dateien löscht?
- Schliessen Sie das Projekt in IntelliJ.
- Löschen Sie die Ordner
.ideasowie die Dateienapp_main.iml,greeter-lib.iml - Löschen Sie die Ordner
targetin beiden Modulen -
Löschen Sie im Parent Projekt den Ordner
src(er ist leer und wird nicht gebraucht) -
Öffnen Sie das Projekt neu in IntelliJ.
InteillJ erkennt die pom.xml und baut das Projekt wieder auf. - Starten Sie in Klasse Main die Methode
mainaus.
Bei mir hat das dann funktioniert ;-)
Fragen zum Verständnis
- Was ist ein Multi-Modul-Maven-Projekt?
- Was ist die Rolle des Parent Projektes?
- Was ist die Rolle der Module?
- Wie werden die Module in der pom.xml des Parent Projektes definiert?
- Wie werden die gemeinsamen Einstellungen im Parent Projekt definiert?
- Wie wird das Parent Projekt in den Modulen referenziert?
- Wie wird die Abhängigkeit von einem Modul zu einem anderen Modul definiert?
- Was ist der Unterschied zwischen dem Modul
app-mainund dem Modulgreeter-lib?
Weiteres Wissen aufbauen
Jetzt da Sie das Prinzip eines Multi-Modul-Maven-Projektes ein erstes Mal angewendet haben, können Sie die obigen Guides wahrscheinlich besser nachvollziehen. Schauen Sie in den ersten Guide rein.