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