EMZETT.
Войти

Maven и Gradle: сборка проектов Java и управление зависимостями

Коротко: Maven и Gradle берут на себя компиляцию, тестирование, упаковку и управление библиотеками в проектах Java; Maven опирается на жёсткие соглашения и XML, Gradle — на гибкие скрипты.

Подробнее: Только с javac всё быстро запутывается: десятки классов, внешние библиотеки (JAR), тесты, пакеты. Инструменты сборки автоматизируют процесс воспроизводимо.

Подробности

Maven

pom.xml описывает проект, зависимости и плагины. Соглашение вместо конфигурации: исходный код в src/main/java, тесты в src/test/java.

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>de.example</groupId>
  <artifactId>gamecatalog</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>

Команды: mvn compile, mvn test, mvn package (JAR в target/), mvn clean install, mvn dependency:tree. Жизненный цикл: validate → compile → test → package → verify → install → deploy. Зависимости берутся из Maven Central; транзитивные зависимости подтягиваются автоматически, scope (compile, test, runtime, provided) управляет использованием.

Gradle

build.gradle(.kts) (DSL Groovy/Kotlin): скрипт вместо XML, инкрементальные сборки и кэш сборки (быстро), стандарт для 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.example.Main" }
tasks.test { useJUnitPlatform() }

Команды: ./gradlew build, ./gradlew test, ./gradlew run. Gradle wrapper (gradlew) загружает подходящую версию Gradle: всегда поставляйте его. Конфигурации: implementation (не видна снаружи), api, compileOnly, runtimeOnly, testImplementation.

Сравнение

  • Maven: легко читается, очень распространён, жёсткая структура, XML многословен; хорош для стандартных проектов, компаний.
  • Gradle: гибче, быстрее для больших проектов/многомодульных, круче кривая обучения, Android/Kotlin.
  • Ant (старый), Bazel (большие монорепозитории).
  • Поддержка IDE: IntelliJ/Eclipse/VS Code импортируют оба.
  • Многомодульные проекты (родительский POM/settings.gradle).

Практика и безопасность

  • Фиксируйте версии (BOM, каталог версий), а не «последнюю».
  • Проверяйте зависимости: OWASP Dependency-Check, Dependabot, mvn versions:display-dependency-updates; Log4Shell показал риск цепочки поставок.
  • Fat/uber JAR (Shade/Shadow, Spring Boot) содержит все зависимости для запуска через java -jar.
  • CI: ./gradlew build/mvn -B verify в GitHub Actions.
  • Типичные ошибки: неверная версия JDK (JAVA_HOME), конфликты зависимостей (dependency:tree), отсутствие интернета/прокси, повреждённый кэш (--refresh-dependencies).
  • Экзамен: объясните задачи инструментов сборки (компиляция, тесты, зависимости, упаковка, автоматизация).

См. также: javac, Конвейер CI/CD