Синтаксические конструкции Groovy
Синтаксические конструкции Groovy
Ниже — конструкции, которые встречаются в скриптах и прикладном коде чаще, чем "чистый" Java-синтаксис. Пунктуация и кавычки: синтаксис и пунктуация.
Базовый синтаксис
Код ITЗагрузка примера кода…
Разбор:
def name = 'Alice'и GString"Hello, $name"— переменные и интерполяция строк.def greet = { who -> ... }— closure;greet('Bob')вызывает его как функцию.[1, 2, 3]и[name: 'John', age: 30]— список и map (ключи без кавычек — идиома Groovy).new File('test.txt').eachLine { line -> ... }— GDK: построчное чтение файла безBufferedReaderвручную.try/catch (e)— перехват исключения;eбез типа;${e.message}в GString — свойство Java-исключения.
Класс с main, картой и замыканием — типичный учебный каркас:
Код ITЗагрузка примера кода…
Разбор:
def data = [name: 'James', location: 'London']— литерал Map с символическими ключами.for (e in data)обходит пары ключ–значение;e.keyиe.valueдоступны у элемента итерации.collection.each { println("value ${it}") }— closure с неявным параметромit.static void main(args)— точка входа JVM;args— аргументы командной строки.- Точка с запятой в конце строк не обязательна.
JSON
import groovy.json.JsonSlurper
import groovy.json.JsonOutput
def json = '{"name":"Alice","age":25}'
def data = new JsonSlurper().parseText(json)
println data.name // Alice
def out = JsonOutput.toJson([name: 'Bob', age: 30])
println JsonOutput.prettyPrint(out)
Разбор:
- Фрагмент на
groovyпоказывает рабочий пример: начинается сimport groovy.json.JsonSlurperи задает контекст выполнения. - Строки
importподключают нужные классы и модули, чтобы дальше вызывать API без полного имени пакета. - Вызовы методов и объявления функций задают основной шаг логики: входные значения передаются в метод и сразу обрабатываются.
- Поток выполнения линейный: шаги идут последовательно, поэтому итог зависит от порядка операций в блоке.
- Итог фрагмента — воспроизводимый результат — вывод в консоль, изменение данных или артефакт, который можно сразу проверить.
В крупных сервисах часто оставляют Jackson (Java API), а JsonSlurper — в скриптах и тестах.
XML
def xml = '''
<people>
<person name="John"/>
</people>'''
def root = new XmlSlurper().parseText(xml)
println root.person.@name
def writer = new StringWriter()
def builder = new groovy.xml.MarkupBuilder(writer)
builder.html {
head { title 'Page' }
body { h1 'Hello from Groovy!' }
}
Разбор:
- Фрагмент на
groovyпоказывает рабочий пример: начинается сdef xml = '''и задает контекст выполнения. - Ключевые операторы и выражения (
def, литералы, вызовы) формируют данные, с которыми работает остальная часть примера. - Вызовы методов и объявления функций задают основной шаг логики: входные значения передаются в метод и сразу обрабатываются.
- Поток выполнения линейный: шаги идут последовательно, поэтому итог зависит от порядка операций в блоке.
- Итог фрагмента — воспроизводимый результат — вывод в консоль, изменение данных или артефакт, который можно сразу проверить.
Коллекции — collect, findAll, groupBy
def books = [
[title: 'Groovy', active: true],
[title: 'Java', active: false],
[title: 'Spock', active: true]
]
def activeTitles = books.findAll { it.active }.collect { it.title }
def byActive = books.groupBy { it.active }
println activeTitles
println byActive[true]*.title
Разбор:
books— список карт (литерал[:]внутри[...]); ключиtitle,activeдоступны какit.title,it.active.findAll { it.active }оставляет только записи сactive: true.collect { it.title }преобразует каждый элемент в строку заголовка → список['Groovy', 'Spock'].groupBy { it.active }возвращаетMap: ключtrue/false, значение — список элементов.byActive[true]*.title— spread*.title: у всех карт в группе взять полеtitle(короткая запись вместоcollect).
Фреймворки и инструменты
| Название | Роль | Связь с Groovy |
|---|---|---|
| Gradle | Сборка JVM/Android | Groovy DSL (и Kotlin DSL) — исполняемые скрипты задач |
| Jenkins | CI/CD | Pipeline, Job DSL, shared libraries на Groovy |
| Spock | Тесты | Спецификации given-when-then, моки |
| Grails | Full-stack веб | Язык приложения — Groovy; стек Spring + Hibernate; с 3.x — Spring Boot |
| Ratpack | HTTP-сервисы, веб-API | Лёгкий неблокирующий фреймворк на Groovy |
| FastJ | 2D-игры на JVM | Шаблон на Groovy, Gradle, кроссплатформа |
| Griffon | Настольные приложения | MVC на Groovy, JavaFX/Swing |
| Geb | UI-тесты | Groovy + WebDriver |
| Micronaut / Quarkus | Микросервисы | Опциональная поддержка Groovy; основной язык обычно Java/Kotlin |
Groovy как язык расширения платформ
Помимо фреймворков, Groovy встроен в готовые продукты — пользователь пишет скрипты, не меняя ядро на Java:
| Продукт | Роль Groovy |
|---|---|
| Jenkins | Pipeline, Job DSL, shared libraries, шаги автоматизации |
| JasperReports / iReport | Выражения и дополнительная логика в отчётах |
| SoapUI | Тестовые сценарии и assertions для SOAP/REST |
| Gradle | Скрипты сборки, кастомные task и плагины |
Grails и Spring Boot — не одно и то же
- Spring Boot — стартовый каркас Spring: вы пишете на Java/Kotlin, конфигурируете beans и REST вручную или через стартеры.
- Grails — конвенции поверх Spring (раньше — отдельный стек) — доменные классы, GORM, динамические finders (
Book.findByTitle(...)), встроенные DSL для constraints. С Grails 3+ под капотом Spring Boot, но модель разработки остаётся "Rails-подобной".
Для нового веб-проекта на JVM чаще выбирают Spring Boot + Java/Kotlin; Groovy там — в тестах (Spock) или сборке (Gradle), а не как основной язык UI.
Сферы применения
- Автоматизация — логи, файлы, миграции, админ-скрипты.
- Тестирование — Spock, Geb, REST Assured (спецификации на Groovy).
- CI/CD — Jenkinsfile, кастомные шаги TeamCity.
- Сборка — Gradle, плагины, кастомные task.
- Конфигурация —
ConfigSlurper, Groovy-конфиги Spring (реже XML). - ETL и отчёты — CSV, JSON, XML в скриптах; выражения в JasperReports.
- Тестирование API — сценарии в SoapUI и REST Assured на Groovy.
Важные типы рантайма Groovy
| Класс / интерфейс | Назначение |
|---|---|
Closure | Замыкание; основа each, DSL, Gradle-блоков |
GroovyShell, GroovyScriptEngine | Выполнение строк и файлов-скриптов |
MetaClass | Динамическое поведение объектов |
Expando | Объект с полями/методами "на лету" |
JsonSlurper, JsonBuilder | JSON |
XmlSlurper, MarkupBuilder | XML |
groovy.sql.Sql | JDBC без бойлерплейта |
Eval (Eval.me('1+1')) — для REPL и прототипов; в продакшене предпочтительнее явный GroovyShell с ограничениями безопасности.
Связанные материалы
- Особенности и расширения — метапрограммирование, AST
- Работа с БД — GORM,
groovy.sql.Sql - Groovy и Java
Как из "списка конструкций" собрать рабочий стиль
Самый полезный шаблон для прикладных задач:
- Считать данные (
JsonSlurper,XmlSlurper, файл, HTTP). - Преобразовать коллекции через
findAll,collect,groupBy. - Сформировать выход в JSON/XML.
- Обернуть в функцию или task Gradle/Jenkins.
import groovy.json.JsonSlurper
import groovy.json.JsonOutput
def users = new JsonSlurper().parseText('[{"name":"Ann","active":true},{"name":"Bob","active":false}]')
def activeNames = users.findAll { it.active }.collect { it.name }
println JsonOutput.toJson([activeUsers: activeNames])
Разбор:
- Фрагмент на
groovyпоказывает рабочий пример: начинается сimport groovy.json.JsonSlurperи задает контекст выполнения. - Строки
importподключают нужные классы и модули, чтобы дальше вызывать API без полного имени пакета. - Вызовы методов и объявления функций задают основной шаг логики: входные значения передаются в метод и сразу обрабатываются.
- Поток выполнения строится на итерации: код последовательно применяет одну и ту же операцию к набору значений.
- Итог фрагмента — воспроизводимый результат — вывод в консоль, изменение данных или артефакт, который можно сразу проверить.
Такой pipeline покрывает значительную часть автоматизации, где Groovy особенно эффективен.
Чек-лист качества скрипта
- Обрабатывайте ошибки ввода через
try/catchи понятные сообщения. - Выносите "магические" значения в переменные или конфиг.
- Разделяйте шаги "чтение", "обработка", "вывод" на отдельные функции.
- Добавляйте 2-3 простых теста Spock для ключевой логики.
Связанные статьи — Spock — первая спецификация, Gradle Groovy DSL, Jenkins Pipeline, Job DSL Playground, Jenkins Shared Library.
Сквозной кейс — JSON-конвейер каталога
Собираем мини-скрипт, который читает входной JSON и готовит данные для БД:
Код ITЗагрузка примера кода…
Разбор:
- Фрагмент на
groovyпоказывает рабочий пример: начинается сimport groovy.json.JsonSlurperи задает контекст выполнения. - Строки
importподключают нужные классы и модули, чтобы дальше вызывать API без полного имени пакета. - Вызовы методов и объявления функций задают основной шаг логики: входные значения передаются в метод и сразу обрабатываются.
- Поток выполнения строится на итерации: код последовательно применяет одну и ту же операцию к набору значений.
- Итог фрагмента — воспроизводимый результат — вывод в консоль, изменение данных или артефакт, который можно сразу проверить.
Этот же выход удобно передавать в слой groovy.sql.Sql или GORM.
Продолжение кейса: Работа с базами данных.