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