Gradle Groovy DSL — первая сборка
Gradle Groovy DSL — первая сборка
Gradle — система сборки для JVM (и не только): компиляция, тесты, упаковка JAR, запуск приложения. Сценарий описывают в build.gradle (язык Groovy) или build.gradle.kts (Kotlin).
Android и многие enterprise-репозитории до сих пор используют Groovy DSL. Строка implementation 'group:artifact:version' внутри dependencies { } — это вызов метода, который Gradle добавляет через делегирование замыканий, а не «магический» синтаксис.
Java-аналог на Kotlin DSL: Gradle — практический старт. Maven: структура и сборки Java. Тесты Spock: 21.md. CI: Jenkinsfile.
Что получится
Проект hello-groovy-gradle: ./gradlew build, JAR, unit-тест. Понимание блоков plugins, repositories, dependencies, tasks.
Термины
| Термин | Простыми словами |
|---|---|
| Проект | Корень с build.gradle или подпапка в multi-module |
Плагин (plugin) | Набор готовых задач (java, application) |
Задача (task) | Единица работы: compileJava, test, build |
| Конфигурация | implementation, testImplementation — «роль» зависимости |
Wrapper (gradlew) | Скрипт, который скачивает фиксированную версию Gradle |
| Maven Central | Публичный репозиторий JAR-файлов |
| Toolchain | Gradle сам подберёт JDK нужной версии |
Groovy DSL и Kotlin DSL
Groovy build.gradle | Kotlin build.gradle.kts |
|---|---|
| Исторически в Android | Новые модули часто на KTS |
| Больше примеров в сети | Строже подсказки IDE |
| Один и тот же Gradle «под капотом» | Один и тот же Gradle |
Логика одинакова; меняется только синтаксис файла.
Создание проекта
mkdir hello-groovy-gradle && cd hello-groovy-gradle
gradle init
В мастере выберите: application, Java, Groovy build script, JUnit Jupiter.
Появятся:
| Файл | Назначение |
|---|---|
gradlew, gradlew.bat | Wrapper для Unix/Windows |
gradle/wrapper/gradle-wrapper.properties | Версия Gradle |
settings.gradle | Имя и список подпроектов |
build.gradle | Сценарий сборки |
settings.gradle
rootProject.name = 'hello-groovy-gradle'
Имя корневого проекта влияет на имя JAR и отображение в IDE. В multi-module сюда добавляют include 'api', 'service'.
build.gradle — разбор по блокам
plugins {
id 'java'
id 'application'
}
group = 'com.example'
version = '1.0.0'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.apache.groovy:groovy:4.0.21'
testImplementation 'org.junit.jupiter:junit-jupiter:5.10.2'
}
application {
mainClass = 'com.example.App'
}
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
tasks.named('test') {
useJUnitPlatform()
}
Таблица блоков
| Блок | Назначение |
|---|---|
plugins { id 'java' } | Задачи компиляции, тестов, JAR |
plugins { id 'application' } | Задача run с точкой входа |
group / version | Координаты артефакта (Maven-style) |
repositories { mavenCentral() } | Откуда скачивать зависимости |
dependencies { ... } | Список библиотек по конфигурациям |
application { mainClass = ... } | Класс с public static void main |
java { toolchain { ... } } | Сборка под JDK 17 без ручного JAVA_HOME |
tasks.named('test') { useJUnitPlatform() } | JUnit 5 вместо устаревшего JUnit 4 |
Конфигурации зависимостей
| Конфигурация | Куда попадает JAR |
|---|---|
implementation | Только ваш модуль при компиляции и runtime |
testImplementation | Только тесты (src/test) |
api (в библиотеках) | Пробрасывается потребителям модуля |
Правило для новичка: production-код → implementation, тестовые библиотеки (JUnit, Spock) → testImplementation.
Строка 'org.apache.groovy:groovy:4.0.21' — координата Maven: group:artifact:version.
Почему implementation '...' работает внутри { } — см. делегирование DSL.
Структура каталогов (Java)
src/main/java/ — production
src/test/java/ — JUnit
src/test/groovy/ — Spock (если подключили)
src/main/java/com/example/App.java:
package com.example;
public class App {
public static void main(String[] args) {
System.out.println("Hello from Gradle Groovy DSL");
}
}
Пакет com.example должен совпадать с путём папок.
Команды
./gradlew tasks # список задач
./gradlew compileJava # только компиляция main
./gradlew test # компиляция + тесты
./gradlew run # запуск main (плагин application)
./gradlew build # compile + test + jar
Wrapper: gradlew фиксирует версию Gradle из gradle-wrapper.properties. В CI и у коллег не нужно ставить Gradle глобально — коммитьте wrapper в Git.
Windows: gradlew.bat вместо ./gradlew.
Своя задача (task)
tasks.register('hello') {
group = 'custom'
description = 'Печать приветствия'
doLast {
println "Gradle task hello"
}
}
| Часть | Смысл |
|---|---|
tasks.register('hello') | Ленивая регистрация задачи |
group / description | Отображение в ./gradlew tasks |
doLast { } | Closure: выполнится в конце задачи |
./gradlew hello
Встроенные задачи плагина java устроены так же: цепочка doFirst / doLast и зависимости между задачами (test зависит от compileTestJava).
Подключение Spock (пример)
dependencies {
testImplementation 'org.spockframework:spock-core:2.3-groovy-4.0'
testImplementation 'org.apache.groovy:groovy:4.0.21'
}
test {
useJUnitPlatform()
}
Тесты в src/test/groovy — см. 21.md.
Multi-module (набросок)
settings.gradle:
rootProject.name = 'parent'
include 'api', 'service'
У api/ и service/ свой build.gradle. Зависимость модуля на модуль:
dependencies {
implementation project(':api')
}
Сборка всего дерева: ./gradlew build из корня.
Частые ошибки
| Симптом | Причина |
|---|---|
Could not find method implementation() | Не применён плагин java |
Unsupported class file major version | Toolchain ниже версии байткода зависимости |
gradlew не найден в CI | Запускают gradle без wrapper — добавьте wrapper в репо |
| Тесты не запускаются | Нет useJUnitPlatform() для JUnit 5 |
Что попробовать
- Добавить Spock и один
CalcSpec. - Spring Boot plugin — сравнить с 271.
- Переписать скрипт в Kotlin DSL — 292.
- Подключить Jenkins с
./gradlew test.
Дальше
Spock · Jenkinsfile · делегирование DSL
См. также
Другие статьи этого же раздела в боковом меню (как на странице «О разделе»). Краткая хронология Groovy на JVM — от идеи James Strachan до ниши Gradle, Jenkins и Spock. Groovy — язык для JVM: тот же байт-код и библиотеки Java, но короче синтаксис, замыкания и скрипты. Набор советов, правил, принципов и обычаев в разработке на этом языке. Простые приложения на Groovy — скрипты на JVM, файлы, JSON и HTTP. Макросы на уровне языка (начиная с Groovy 2.5) — groovy.transform.Macro позволяет инжектить код, основываясь на анализе AST. Статическая и динамическая типизация в Groovy, примитивы JVM, строки GString, коллекции, диапазоны и ключевые операторы def, as, instanceof. Операторы и выражения в Groovy - арифметика, логика и выразительный синтаксис поверх JVM-экосистемы. Циклы и управляющие конструкции Groovy - императивные и декларативные способы описания логики выполнения. В этом примере greet — это переменная, содержащая замыкание. Замыкание принимает один параметр name и выводит приветствие. Вызов greet(Groovy) выполняет код внутри замыкания. Нет проверяемых исключений — компилятор Groovy игнорирует механизм throws, принятый в Java. Динамическая типизация, метапрограммирование, AST-трансформации, DSL, работа с XML и JSON, синтаксический сахар и интеграция с Java. Кавычки, скобки, замыкания, switch, регулярные выражения и truthiness в Groovy.История языка Groovy
Что требуется знать перед началом изучения языка программирования Groovy
Рекомендации по разработке на Groovy
Простые приложения на Groovy
Основы языка Groovy
Типы данных и объявление переменных
Операторы и выражения в Groovy
Циклы и управляющие конструкции
Объектно-ориентированное программирование в Groovy
Иерархия исключений в Groovy
Особенности и расширения языка Groovy
Синтаксис и пунктуация в Groovy