Maven und Gradle: Java-Projekte bauen und Abhängigkeiten verwalten
Kurz: Maven und Gradle übernehmen das Kompilieren, Testen, Verpacken und die Verwaltung von Bibliotheken in Java-Projekten; Maven setzt auf feste Konventionen und XML, Gradle auf flexible Skripte.
Genauer: Mit javac allein wird es schnell unübersichtlich: Dutzende Klassen, externe Bibliotheken (JARs), Tests, Pakete. Build-Werkzeuge automatisieren den Ablauf reproduzierbar.
Im Detail
Maven
pom.xml beschreibt Projekt, Abhängigkeiten und Plugins. Konvention vor Konfiguration: Quellcode in src/main/java, Tests in src/test/java.
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>de.beispiel</groupId>
<artifactId>spielekatalog</artifactId>
<version>1.0.0</version>
<properties><maven.compiler.release>21</maven.compiler.release></properties>
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.10.2</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>Befehle: mvn compile, mvn test, mvn package (JAR in target/), mvn clean install, mvn dependency:tree. Lebenszyklus: validate → compile → test → package → verify → install → deploy. Abhängigkeiten kommen aus Maven Central; transitive Abhängigkeiten werden automatisch geholt, Scope (compile, test, runtime, provided) steuert Verwendung.
Gradle
build.gradle(.kts) (Groovy/Kotlin-DSL): Skript statt XML, inkrementelle Builds und Build-Cache (schnell), Standard bei Android.
plugins { java; application }
repositories { mavenCentral() }
dependencies {
implementation("com.google.guava:guava:33.0.0-jre")
testImplementation("org.junit.jupiter:junit-jupiter:5.10.2")
}
java { toolchain { languageVersion = JavaLanguageVersion.of(21) } }
application { mainClass = "de.beispiel.Main" }
tasks.test { useJUnitPlatform() }Befehle: ./gradlew build, ./gradlew test, ./gradlew run. Gradle Wrapper (gradlew) lädt die passende Gradle-Version: immer mitliefern. Konfigurationen: implementation (nicht nach außen sichtbar), api, compileOnly, runtimeOnly, testImplementation.
Vergleich
- Maven: einfach zu lesen, sehr verbreitet, starre Struktur, XML ausführlich; gut für Standard-Projekte, Firmen.
- Gradle: flexibler, schneller bei großen Projekten/Multi-Module, steilere Lernkurve, Android/Kotlin.
- Ant (alt), Bazel (große Monorepos).
- IDE-Unterstützung: IntelliJ/Eclipse/VS Code importieren beide.
- Mehr-Modul-Projekte (Parent-POM/
settings.gradle).
Praxis und Sicherheit
- Versionen festlegen (BOMs, Version-Catalog), nicht „latest“.
- Abhängigkeiten prüfen: OWASP Dependency-Check, Dependabot,
mvn versions:display-dependency-updates; Log4Shell zeigte Lieferkettenrisiko. - Fat/Uber-JAR (Shade/Shadow, Spring Boot) enthält alle Abhängigkeiten zum Starten mit
java -jar. - CI:
./gradlew build/mvn -B verifyin GitHub Actions. - Typische Fehler: falsche JDK-Version (
JAVA_HOME), Abhängigkeitskonflikte (dependency:tree), fehlende Internetverbindung/Proxy, Cache korrupt (--refresh-dependencies). - Prüfung: Aufgabe von Build-Tools erklären (kompilieren, testen, Abhängigkeiten, Paketieren, Automatisieren).
Siehe auch: javac, CI/CD-Pipeline