Java Maven Einführung
Was Maven ist, wie es Java-Projekte baut und wie man mvn-Befehle installiert und ausführt.
Maven ist das Standard-Build-Automatisierungs- und Abhängigkeitsverwaltungstool für Java. Es wandelt ein Projekt in eine deklarative Beschreibung um — was es ist, wovon es abhängt, wie es gebaut wird — und führt dann den Build für Sie durch. Anstatt JAR-Dateien und javac-Flags manuell zu verwalten, deklarieren Sie Ihre Anforderungen in einer einzigen Datei, und Maven lädt Abhängigkeiten herunter, kompiliert, testet und verpackt Ihren Code durch einen vorhersehbaren, reproduzierbaren Lebenszyklus.
Das POM: ein Projekt als Daten
Jedes Maven-Projekt wird durch eine pom.xml (Project Object Model) beschrieben. Es identifiziert das Projekt mit drei Koordinaten — groupId, artifactId und version (zusammen das "GAV") — und listet die benötigten Bibliotheken auf. Dasselbe Koordinatenschema benennt Ihr Projekt und jede Abhängigkeit, wodurch Maven Artefakte in einem Repository lokalisiert.
<project xmlns="http://maven.apache.org/POM/4.0.0">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>shop-app</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
<properties>
<maven.compiler.release>21</maven.compiler.release>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>6.1.0</version>
</dependency>
</dependencies>
</project>Das <packaging>-Element teilt Maven mit, was es produzieren soll (jar, war, pom). Der <properties>-Block enthält wiederverwendbare Werte — hier das Java-Release, auf das der Compiler abzielt. Das POM wächst, um Plugins, Profile und Vererbung abzudecken; das Maven-POM-Kapitel erläutert diese Teile im Detail.
Abhängigkeiten und der transitive Klassenpfad
Sie listen nur Ihre direkten Abhängigkeiten auf. Maven liest das eigene POM jeder Abhängigkeit und zieht alles heran, was diese benötigen — die transitiven Abhängigkeiten — und erstellt den vollständigen Klassenpfad automatisch. Das Deklarieren von spring-web bringt auch spring-core mit, ohne dass Sie es benennen müssen.
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.17.0</version>
</dependency>Jede Abhängigkeit hat einen Scope, der steuert, wann sie im Klassenpfad verfügbar ist. Der Standard, compile, macht sie überall verfügbar; test beschränkt sie auf Testcode; provided bedeutet, dass die Laufzeitumgebung sie bereitstellt. Für Versionskonflikte, Ausschlüsse und dependencyManagement siehe Maven-Abhängigkeiten.
| Scope | Im Kompilier-Klassenpfad | Im Test-Klassenpfad | Verpackt | Typische Verwendung |
|---|---|---|---|---|
compile (Standard) | Ja | Ja | Ja | Normale Bibliotheken |
provided | Ja | Ja | Nein | Servlet API, zur Laufzeit bereitgestellt |
runtime | Nein | Ja | Ja | JDBC-Treiber |
test | Nein | Ja | Nein | JUnit, Mockito |
Der Build-Lebenszyklus
Maven-Builds laufen durch eine feste Abfolge von Phasen. Die wichtigsten Phasen des Standard-Lebenszyklus sind validate, compile, test, package, verify, install und deploy. Das Ausführen einer Phase führt jede vorherige Phase aus — mvn package validiert, kompiliert und testet zuerst, dann verpackt es. Sie rufen Phasen nie außer der Reihe auf.
mvn compile # compile main sources
mvn test # compile + run unit tests
mvn package # compile + test + build the JAR/WAR
mvn install # package + copy artifact into your local repository
mvn clean package # delete target/ first, then build freshJede Phase ist an ein oder mehrere Goals gebunden, die von Plugins bereitgestellt werden (zum Beispiel ist compiler:compile an die compile-Phase gebunden). In Plugins liegt die eigentliche Arbeit; der Lebenszyklus ordnet sie lediglich. Das Kapitel Maven-Build-Lebenszyklus behandelt alle drei eingebauten Lebenszyklen und wie Goals an Phasen gebunden werden.
Repositories
Maven holt Artefakte aus Repositories. Beim Build sucht es zuerst in Ihrem lokalen Repository (~/.m2/repository), einem Cache auf Ihrem Rechner. Bei einem Cache-Miss lädt es aus einem Remote-Repository herunter — standardmäßig Maven Central — und speichert eine Kopie lokal, sodass der nächste Build offline-schnell ist. Teams fügen oft ein privates Repository für interne Bibliotheken hinzu.
project pom.xml → local repo (~/.m2) → remote repo (Maven Central)
(cache hit?) (download + cache)Ein ausführbares Beispiel
Der Code-Runner hat kein Maven in seinem Klassenpfad, daher modelliert das folgende Programm Mavens Kernmechanismen mit reinem JDK-Code: Es speichert ein kleines POM als Map, löst den transitiven Abhängigkeitsabschluss auf (dedupliziert gemeinsame Artefakte) und durchläuft den Build-Lebenszyklus, wobei es bei der angeforderten Phase stoppt. Die Strukturen hier — GAV-Koordinaten, transitive Auflösung, geordnete Phasen — entsprechen genau dem, was Maven tatsächlich tut.
Was aus dem Lauf mitzunehmen ist:
- Das Projekt und jede Abhängigkeit werden durch dasselbe GAV-Triple benannt, weshalb
Project coordinates: com.example:shop-app:1.0.0genauso aussieht wie eine Abhängigkeitszeile. - Nur zwei Abhängigkeiten werden deklariert, aber der aufgelöste Klassenpfad hat vier JARs —
spring-coreundjackson-annotationswurden transitiv hereingezogen, genau wie Maven es tut. - Das
seen-Set stellt sicher, dass jedes Artefakt nur einmal erscheint; das ist Mavens Deduplizierung, die verhindert, dass eine gemeinsam genutzte Bibliothek zweimal im Klassenpfad landet. Executing: mvn packageführtvalidate,compileundtestvorpackageaus und stoppt dann — das Ausführen einer Phase führt immer jede frühere Phase in der richtigen Reihenfolge aus.- Der Build stoppt bei
packageund erreicht nieinstall, was spiegelt, wie das angeforderte Goal begrenzt, wie weit der Lebenszyklus voranschreitet.
Wann Maven zu verwenden ist
Maven glänzt bei konventionellen Java- und JVM-Projekten: Seine "Convention over Configuration"-Vorgaben (Quellcode in src/main/java, Tests in src/test/java, Ausgabe in target/) bedeuten, dass ein neuer Mitarbeiter jedes Maven-Projekt auf dieselbe Weise bauen kann. Sein deklaratives XML ist leicht zu lesen und zu vergleichen, und die IDE-Unterstützung ist ausgereift. Der Kompromiss ist Ausführlichkeit und begrenzte Flexibilität bei ungewöhnlichen Builds. Wenn Sie skriptgesteuerte, hochgradig angepasste Builds benötigen, ist Gradle die gängige Alternative — es verwendet ein programmierbares Build-Skript anstelle von deklarativem XML, deckt aber denselben Bereich ab: GAV-Koordinaten, transitive Abhängigkeiten und ein Task- (statt Phasen-)Graph.
Nächste Schritte
- Maven POM — die vollständige Struktur von
pom.xml, einschließlich Plugins und Vererbung. - Maven-Abhängigkeiten — Scopes, Ausschlüsse und das ausführliche Auflösen von Versionskonflikten.
- Maven-Build-Lebenszyklus — jede Phase, die drei Lebenszyklen und das Binden von Goals.
- Gradle-Einführung — die skriptbasierte Alternative zu Maven.