Этап 2 - Gradle: современная система сборки
Maven предсказуем, но некоторым командам нужна сборка, которую проще программировать, ускорять в больших проектах и расширять под собственные задачи. Gradle появился именно для таких проектов. Он особенно часто встречается в Android, Kotlin и современных Java/Spring-проектах.
Gradle - это система автоматизации сборки на основе задач. Сборка описывается не XML-файлом, а небольшим языком настройки: Groovy DSL или Kotlin DSL. DSL означает “предметно-ориентированный язык”: он выглядит как код, но используется для описания сборки.

Почему появился 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 может пропустить эту задачу. В больших проектах это экономит много времени.
Последовательность шагов
- Gradle читает
build.gradleилиbuild.gradle.kts. - Подключает плагины.
- Читает список репозиториев и зависимостей.
- Строит граф задач.
- Выполняет только нужные задачи и создает артефакт.
Конкретный пример
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.
Вопросы для самопроверки
- Почему в проекте обычно запускают
./gradlew, а не простоgradle? - Что делает блок
repositories? - Чем
implementationотличается отtestImplementation?
Практика перед следующим уроком
Создайте небольшой build.gradle с плагином java, репозиторием mavenCentral() и одной зависимостью implementation. Запустите ./gradlew tasks и ./gradlew dependencies, затем определите, какая задача собирает проект и откуда Gradle пытается скачать библиотеки.