Логотип Workflow

Article

Updated at:

Stage 2: Gradle Basics

Этап 2 - Gradle: современная система сборки

Maven предсказуем, но некоторым командам нужна сборка, которую проще программировать, ускорять в больших проектах и расширять под собственные задачи. Gradle появился именно для таких проектов. Он особенно часто встречается в Android, Kotlin и современных Java/Spring-проектах.

Gradle - это система автоматизации сборки на основе задач. Сборка описывается не XML-файлом, а небольшим языком настройки: Groovy DSL или Kotlin DSL. DSL означает “предметно-ориентированный язык”: он выглядит как код, но используется для описания сборки.

Этап 2 - Gradle: современная система сборки

Почему появился Gradle

Главное отличие от Maven - модель работы. Maven опирается на фиксированный жизненный цикл: compile, test, package и другие этапы. Gradle строит граф задач. Задача может компилировать код, запускать тесты, копировать файлы, генерировать исходники, собирать Docker image или публиковать артефакт.

Groovy DSL обычно пишут в файле build.gradle. Kotlin DSL обычно пишут в build.gradle.kts. Kotlin DSL лучше проверяется компилятором и удобнее подсказывается в IDE. Groovy DSL короче и часто встречается в уже существующих проектах.

Gradle-файл обычно содержит три важные части: plugins, repositories и dependencies. Плагины добавляют возможности сборки. Репозитории говорят Gradle, откуда скачивать библиотеки. Зависимости описывают, какие библиотеки нужны проекту.

Пример с зависимостями такой же, как в Maven. Если проекту нужен готовый веб-слой, он подключает Spring Web. Проект не копирует код Spring внутрь себя и не пишет HTTP-обработку с нуля. Gradle скачивает библиотеку из Maven Central и добавляет ее в сборку.

Wrapper - важная часть Gradle. Файлы gradlew, gradlew.bat и папка gradle/wrapper позволяют всем разработчикам и CI-серверу использовать одну и ту же версию Gradle без ручной установки.

Инкрементальная сборка - одна из сильных сторон Gradle. Если входные файлы и результаты задачи не изменились, Gradle может пропустить эту задачу. В больших проектах это экономит много времени.

Последовательность шагов

  1. Gradle читает build.gradle или build.gradle.kts.
  2. Подключает плагины.
  3. Читает список репозиториев и зависимостей.
  4. Строит граф задач.
  5. Выполняет только нужные задачи и создает артефакт.

Конкретный пример

plugins {
    id 'java'
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    testImplementation 'org.junit.jupiter:junit-jupiter'
}

Разберем пример. Блок plugins подключает возможности сборки. id 'java' добавляет стандартные Java-задачи: компиляцию, запуск тестов и создание JAR. Блок repositories указывает, где искать библиотеки. mavenCentral() означает публичный Maven Central.

Блок dependencies описывает, что нужно проекту. implementation 'org.springframework.boot:spring-boot-starter-web' подключает Spring Web для основного кода. testImplementation 'org.junit.jupiter:junit-jupiter' подключает JUnit только для тестов. Это важно: тестовые библиотеки не должны попадать в основной classpath приложения.

Полезная таблица

КомандаЧто делает
./gradlew buildКомпилирует, тестирует и собирает проект.
./gradlew cleanУдаляет результат сборки.
./gradlew testЗапускает тесты.
./gradlew dependenciesПоказывает дерево зависимостей.
./gradlew tasksПоказывает доступные задачи.

Где это встречается в работе

Gradle выбирают, когда важны скорость сборки, гибкая автоматизация и удобная работа с большими проектами. Maven чаще выбирают, когда важнее строгие соглашения, простота и привычность для команды.

Частые ошибки

  • Переименовывать служебные блоки Gradle. plugins, repositories, dependencies, implementation должны оставаться как есть.
  • Запускать установленный gradle, когда в проекте есть ./gradlew.
  • Не понимать, из какого репозитория скачивается библиотека.
  • Смешивать зависимости для основного кода и зависимости только для тестов.

Чеклист понимания

  • Я понимаю, чем Gradle отличается от Maven.
  • Я могу объяснить, что такое Gradle task.
  • Я понимаю, зачем нужен Wrapper.
  • Я могу прочитать простой build.gradle.

Вопросы для самопроверки

  1. Почему в проекте обычно запускают ./gradlew, а не просто gradle?
  2. Что делает блок repositories?
  3. Чем implementation отличается от testImplementation?

Практика перед следующим уроком

Создайте небольшой build.gradle с плагином java, репозиторием mavenCentral() и одной зависимостью implementation. Запустите ./gradlew tasks и ./gradlew dependencies, затем определите, какая задача собирает проект и откуда Gradle пытается скачать библиотеки.

Авторизуйтесь чтоб пройти тесты

Practice

Интерактивная практика

Выполните задания и сразу проверьте ответ.