Перейти к основному содержимому

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-файлов
ToolchainGradle сам подберёт JDK нужной версии

Groovy DSL и Kotlin DSL

Groovy build.gradleKotlin 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.batWrapper для 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 versionToolchain ниже версии байткода зависимости
gradlew не найден в CIЗапускают gradle без wrapper — добавьте wrapper в репо
Тесты не запускаютсяНет useJUnitPlatform() для JUnit 5

Что попробовать

  1. Добавить Spock и один CalcSpec.
  2. Spring Boot plugin — сравнить с 271.
  3. Переписать скрипт в Kotlin DSL — 292.
  4. Подключить Jenkins с ./gradlew test.

Дальше

Spock · Jenkinsfile · делегирование DSL


См. также

Другие статьи этого же раздела в боковом меню (как на странице «О разделе»).