2 Einleitung zu Apache Maven

Apache Maven ist ein leistungsfähiges Build-Management-Tool für Java-Projekte. Es automatisiert den gesamten Build-Prozess – von der Kompilierung, über das Testing, bis hin zur Bereitstellung von Artefakten.

2.1 Warum Maven?

Traditionelle Build-Tools wie make oder Ant erfordern oft manuelle Konfigurationsschritte und individuelle Skripte für jede Umgebung. Maven verfolgt einen deklarativen Ansatz:

Ein großer Vorteil: Wiederholbare Builds, unabhängig vom Entwicklerrechner. Wenn das Projekt bei einem Teammitglied funktioniert, läuft es mit hoher Wahrscheinlichkeit überall identisch.

2.2 Erster Maven-Build in 60 Sekunden

Um Maven direkt auszuprobieren, kann folgender Befehl verwendet werden, um ein einfaches Java-Projekt mit der Standardstruktur zu erstellen:

mvn archetype:generate -DgroupId=com.example -DartifactId=mein-projekt -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

Dies erzeugt eine Verzeichnisstruktur mit einer pom.xml, in der bereits alle wichtigen Abhängigkeiten und Build-Prozesse definiert sind. Der gesamte Build-Prozess kann dann mit einem einzigen Befehl ausgeführt werden:

mvn package

Maven kompiliert den Code, führt Tests aus und erstellt eine ausführbare JAR-Datei im target/-Verzeichnis. Hierbei kommt es zu einem unerwarteten Ergebnis:

...
[ERROR] COMPILATION ERROR :
[INFO] -------------------------------------------------------------
[ERROR] Source option 5 is no longer supported. Use 8 or later.
[ERROR] Target option 5 is no longer supported. Use 8 or later.
[INFO] 2 errors

Das passiert in der Regel, weil der schnell erzeugte Projektentwurf („Quickstart Archetype“) noch auf Java 5 voreingestellt ist. Moderne Java-Umgebungen und das aktuelle Maven Compiler Plugin unterstützen standardmäßig jedoch nur Quellversionen ab Java 8. Es gibt zwei gängige Lösungen:

  1. Das Build Plugin in der pom.xml anpassen.
<build>
    <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>
    </plugins>
</build>
  1. Die Compileroptionen in der pom.xml anpassen.
<properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
</properties>

Bei der Ausführung per

mvn exec:java

kommt es zu eiener weiteren Fehlermeldung:

[ERROR] Failed to execute goal org.codehaus.mojo:exec-maven-plugin:3.5.0:java (default-cli) on project mein-projekt: The parameters 'mainClass' for goal org.codehaus.mojo:exec-maven-plugin:3.5.0:java are missing or invalid -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] 

Auch hier bieten sich zwei gängige Lösungen an:

  1. Das Build Plugin in der pom.xml anpassen.
<build>
  <plugins>
    <plugin>
      <groupId>org.codehaus.mojo</groupId>
      <artifactId>exec-maven-plugin</artifactId>
      <version>3.5.0</version>
      <configuration>
        <mainClass>com.example.App</mainClass>
      </configuration>
    </plugin>
  </plugins>
</build>
  1. Kommandozeilenoption verwenden:
mvn exec:java -Dexec.mainClass="com.example.App"

2.3 Maven vs. Andere Build-Tools

Maven ist nicht das einzige Build-Tool für Java. Eine kurze Einordnung:

Tool Architektur Vorteile Nachteile
Maven XML-basiert, deklarativ Standardisierte Strukturen, gute Dependency-Verwaltung XML kann umständlich sein
Gradle DSL, Groovy/Kotlin, deklarativ Flexibler, schneller als Maven Höhere Einstiegshürde
Ant Skriptbasiert, imperativ Vollständige Kontrolle über den Build Manuelle Konfiguration nötig

Maven ist besonders gut geeignet für Standardprojekte mit klaren Abhängigkeiten und bietet eine gute Integration mit Java-Ökosystemen wie Spring Boot oder Jakarta EE.