Zum Inhalt

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.

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:

- multimodulemaven
   - .idea
   - .mvn
   - src
   - .gitignore
   - pom.xml

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:

- multimodulemaven
   - .idea
   - .mvn
   - app-main
      - src
      - pom.xml
   - src
   - .gitignore
   - pom.xml

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.

System.out.println("Main.main: " + Greeter.greet("BBW"));

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:

import ch.bbw.pr.greeter.Greeter;

Und im pom.xml von app-main wird die Dependency hinzugefügt:

xml<dependency>
    <groupId>ch.bbw.pr.multimodulemaven</groupId
    ...

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 artefactId das packaging und name hinzufügen
    <artifactId>app_main</artifactId>
    <packaging>jar</packaging>
    <name>app_main</name>

In der pom.xml von greeter-lib muss dies verändert werden:

  • Entfernen der Properties, denn diese werden vom Parent-Projekt übernommen.
  • Unter der artefactId das packaging und name hinzufügen
    <artifactId>greeter-lib</artifactId>
    <packaging>jar</packaging>
    <name>greeter-lib</name>

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 .idea sowie die Dateien app_main.iml, greeter-lib.iml
  • Löschen Sie die Ordner target in 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 main aus.

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-main und dem Modul greeter-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.