EMZETT.
Login

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 verify in 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