20 Multi-Module Projekt mit Maven

20.1 Einführung

Ein Multi-Module-Projekt in Maven besteht aus einem übergeordneten Projekt (Aggregator-Projekt) und mehreren Unterprojekten (Submodulen). Diese Struktur ermöglicht zentrale Verwaltung gemeinsamer Konfigurationen und erlaubt es, Module separat zu entwickeln, zu testen und zu bauen.

20.2 Aufbau eines Multi-Module-Projekts

20.2.1 Verzeichnisstruktur

parent-project
|-- pom.xml
|-- module1
|   `-- pom.xml
|-- module2
|   `-- pom.xml
|-- module3
    `-- pom.xml

20.2.2 Haupt-POM-Datei

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>parent-project</artifactId>
    <version>1.0.0</version>
    <packaging>pom</packaging>

    <modules>
        <module>module1</module>
        <module>module2</module>
        <module>module3</module>
    </modules>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-core</artifactId>
                <version>5.3.16</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.8.1</version>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <version>2.22.2</version>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
</project>

20.2.3 Modul-POM-Dateien

Jedes Modul erbt Konfigurationen vom übergeordneten POM:

20.2.3.1 Modul 1

<project>
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.example</groupId>
        <artifactId>parent-project</artifactId>
        <version>1.0.0</version>
    </parent>
    <artifactId>module1</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
        </dependency>
    </dependencies>
</project>

20.2.3.2 Modul 2

<project>
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.example</groupId>
        <artifactId>parent-project</artifactId>
        <version>1.0.0</version>
    </parent>
    <artifactId>module2</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
        </dependency>
    </dependencies>
</project>

20.2.3.3 Modul 3

<project>
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.example</groupId>
        <artifactId>parent-project</artifactId>
        <version>1.0.0</version>
    </parent>
    <artifactId>module3</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
        </dependency>
    </dependencies>
</project>

20.3 Bauen eines Multi-Module-Projekts

mvn clean install

Dieser Befehl baut alle Module in der Reihenfolge, in der sie im <modules> Abschnitt aufgeführt sind.

20.4 Vorteile von Multi-Module-Projekten

20.5 Beispiel: Einfaches Webanwendungsprojekt

webapp-project
|-- pom.xml
|-- frontend
|   `-- pom.xml
|-- backend
    `-- pom.xml

20.5.1 Haupt-POM

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>webapp-project</artifactId>
    <version>1.0.0</version>
    <packaging>pom</packaging>

    <modules>
        <module>frontend</module>
        <module>backend</module>
    </modules>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
                <version>2.6.3</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <version>2.6.3</version>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
</project>

20.5.2 Frontend-Modul

<project>
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.example</groupId>
        <artifactId>webapp-project</artifactId>
        <version>1.0.0</version>
    </parent>
    <artifactId>frontend</artifactId>
    <packaging>jar</packaging>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
    </dependencies>
</project>

20.5.3 Backend-Modul

<project>
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.example</groupId>
        <artifactId>webapp-project</artifactId>
        <version>1.0.0</version>
    </parent>
    <artifactId>backend</artifactId>
    <packaging>jar</packaging>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>runtime</scope>
        </dependency>
    </dependencies>
</project>

Diese Struktur ermöglicht eine klare Trennung von Frontend- und Backend-Code, wobei gemeinsame Einstellungen und Abhängigkeiten im Haupt-POM verwaltet werden. Somit lässt sich das gesamte Projekt effizient aufbauen, warten und erweitern.