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