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

Первая программа на Groovy

Разработчику Архитектору

Play ITЗагрузка интерактивного демо…


Первая программа на Groovy

Где применяют Groovy

Groovy — динамический язык на JVM: синтаксис ближе к Python, совместимость с Java-классами. Используют в Gradle, Jenkins pipeline, скриптах автоматизации, предметных DSL (математика, обработка научных данных, отчёты) и legacy-проектах.

Типичные точки встречи с языком:

  • Gradle — сборка Android и Java-проектов;
  • Jenkins — pipeline и shared libraries;
  • Spock — выразительные тесты к Java/Kotlin-коду;
  • JasperReports / iReport — выражения и логика внутри отчётов;
  • SoapUI — сценарии тестирования веб-сервисов.

Первая программа — println в groovy / groovyc.

Самый короткий скрипт без класса и без IDE:

println 'Hello, Groovy!'

Классический пример с функциями — последнее выражение в теле метода возвращается автоматически:

Код ITЗагрузка примера кода…

Разбор:

  • helloFunction — метод с def; GString "Hello, ${name}" подставляет аргумент.
  • sum без return — Groovy возвращает значение последнего выражения (a + b).
  • subtraction(double a, double b) — явные типы параметров, как в Java; здесь нужен явный return.
  • Вызов helloFunction('Groovy!') допускает скобки или их отсутствие у одноаргументных методов.

Разбор короткого скрипта:

  • println — встроенный метод Groovy: печатает аргумент в stdout и добавляет перевод строки (аналог System.out.println в Java, но короче).
  • Строка в одинарных кавычках 'Hello, Groovy!' — обычный String без интерполяции: всё внутри кавычек выводится буквально.
  • Файл .groovy без class и main компилируется как подкласс groovy.lang.Script; при запуске groovy script.groovy выполняются инструкции верхнего уровня по порядку.
  • Результат в консоли — одна строка Hello, Groovy! — этого достаточно, чтобы проверить, что JDK, Groovy и PATH настроены.
  • Такой формат удобен для одноразовых скриптов; для библиотек и приложений позже добавляют class и static void main.

Перед стартом: что знать перед Groovy. После Hello World логично перейти к типам данных и Groovy и Java.

Практическое задание

Выполните нижеследующее задание.

А теперь давайте немного попрактикуемся и посмотрим, как выглядит работа с Groovy. Пройдитесь и выполните все действия по алгоритму, но на каждом шаге старайтесь исследовать то, что на экране, чтобы понимать.

Установка программ обычно выглядит так (NetBeans и JDK — отдельные мастера; Groovy идёт через JVM):

Play ITЗагрузка интерактивного демо…

  1. Установите Apache NetBeans и запустите (на рабочем столе будет ярлык).

  2. Выберите "New Project" (или File – New Project).

  3. Выберите "Groovy with Gradle" (в списке шаблонов – Groovy with Gradle – Groovy Application).

  4. Заполните сведения о проекте:

    • Project Name: gradleproject1 – можете задать своё имя;
    • Project Location – выберите папку, где будет храниться проект;
    • Project Folder – укажет путь к проекту;
    • Package Name – com.test.gradleproject1;
    • Java Version – укажите свою версию (или последнюю доступную);
    • Gradle DSL – нам нужен Groovy.
  5. Проверьте всё и нажмите Finish – IDE подготовит проект.

  6. В левой части окна будет структура проекта.

  7. В правой части окна будет код со стандартным шаблоном:

package com.test.gradleproject1

class App {
String getGreeting() {
return 'Hello World!'
}

static void main(String[] args) {
println new App().greeting
}
}

Разбор:

  • package com.test.gradleproject1 задаёт пакет: скомпилированный класс окажется в папке com/test/gradleproject1/, как в Java.
  • class App — обычный класс приложения; Gradle/NetBeans подставляют его как точку входа в шаблоне Groovy Application.
  • String getGreeting() — метод с явным типом возврата; return 'Hello World!' возвращает строку (можно опустить return, если последнее выражение в методе — значение).
  • static void main(String[] args) — точка входа JVM: при Run IDE вызывает именно этот метод.
  • println new App().greeting — создаётся экземпляр App, вызывается геттер getGreeting() (в Groovy свойство greeting — это вызов getGreeting()), результат печатается в Output.
  1. Чтобы запустить проект, нужно нажать правой кнопкой мыши на проекте в структуре и выбрать "Run" или нажать зеленую кнопку на панели инструментов.

  2. Если всё успешно – то в нижней части окна в панели Output будет полная информация о процессе сборки, и вывод исполнения команды. Наша программа просто должна вывести сообщение "Hello World!", и это мы можем увидеть именно там:

image.png

Как можно заметить, язык и принципы построения очень похожи на Java — класс, main, типы полей.


Запуск без IDE

После установки Groovy (SDKMAN, дистрибутив Apache Groovy или sdk install groovy) создайте файл hello.groovy:

println 'Hello, Groovy!'
def name = args ? args[0] : 'World'
println "Hello, $name"

Разбор:

  • Первая строка println 'Hello, Groovy!' всегда выполняется и не зависит от аргументов командной строки.
  • def name = args ? args[0] : 'World'def объявляет локальную переменную; тернарный оператор — если массив args непустой, берётся первый аргумент, иначе 'World'.
  • args в скрипте — это String[] аргументов CLI (как в main у Java); при groovy hello.groovy Alice в args[0] будет Alice.
  • println "Hello, $name" — GString в двойных кавычках: $name подставляется в строку на этапе выполнения.
  • При запуске без аргументов вывод — Hello, Groovy! и Hello, World; с Alice — второе приветствие Hello, Alice.

Запуск:

groovy hello.groovy Alice

Разбор:

  • groovy — команда интерпретатора/рантайма Groovy (должна быть в PATH после установки SDKMAN или дистрибутива Apache Groovy).
  • hello.groovy — путь к файлу скрипта; интерпретатор выполнит его построчно.
  • Alice — первый аргумент командной строки; в скрипте он попадёт в args[0] (см. пример выше).
  • Порядок: сначала компиляция/подготовка скрипта, затем выполнение; ошибки синтаксиса покажутся до запуска логики.
  • Успешный прогон завершается кодом 0 и двумя строками приветствия в терминале.

Скрипт без объявления class компилируется в подкласс groovy.lang.Script; args — аргументы командной строки.

Интерактивный REPL — groovysh (удобно проверять выражения без файла):

groovy:000> 2 + 3
===> 5
groovy:000> def x = [1, 2, 3]
===> [1, 2, 3]
groovy:000> x.sum()
===> 6

Разбор:

  • Приглашение groovy:000> — номер введённой команды в сессии REPL.
  • 2 + 3 вычисляется сразу; ===> 5 — результат последнего выражения (в Groovy почти всё — выражение с значением).
  • def x = [1, 2, 3] создаёт список; литерал [...] — тот же синтаксис, что в скриптах и Gradle.
  • x.sum() — метод GDK для коллекций (сумма элементов); в чистой Java для List<Integer> писали бы цикл или stream.
  • Выход: :q или Ctrl+D — сессия не сохраняется в файл, пока вы сами не скопируете код.

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

СимптомПричина
groovy не найденSDKMAN/Java не настроены
MissingPropertyExceptionПеременная без def в скрипте — используйте def name
Несовместимость с JavaНужен JDK той же major-версии

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

Вызов Java из Groovy — без импорта java.util.*, если класс из JDK:


import java.time.LocalDate

def today = LocalDate.now()
println "Сегодня: $today"

Разбор:

  • import java.time.LocalDate — тот же импорт, что в Java; Groovy компилируется в байт-код JVM и видит классы JDK.
  • LocalDate.now() — статический метод Java 8+; тип выводится, можно писать def today.
  • GString подставляет значение todayLocalDate есть читаемый toString()).
  • Любая Java-библиотека из classpath (Maven/Gradle) вызывается так же: new SomeService().run().

@Grab в скрипте — подтянуть JAR без отдельного build.gradle:

@Grab('org.apache.commons:commons-lang3:3.14.0')

import org.apache.commons.lang3.StringUtils

println StringUtils.capitalize('groovy')

Разбор:

  • @Grab('group:artifact:version') — аннотация Grape: при первом запуске скрипта скачивает артефакт из Maven Central (нужен доступ в сеть).
  • После загрузки классы из JAR доступны как при обычной зависимости Gradle.
  • StringUtils.capitalize — пример вызова Java-API из сторонней библиотеки.
  • Для продакшена и CI надёжнее фиксировать зависимости в Gradle/Maven, а не только @Grab.

Gradle — см. Gradle Groovy DSL и Jenkins Pipeline.


В подборках

Статья входит в тематические подборки и блок "С чего начать?" на главной. Соседние шаги того же маршрута:

Первые шаги (маршрут подборки) — Первая программа на Smalltalk, Первая программа на Haskell, Первая программа на Lua, Первая программа на Scala, Первая программа на Swift, Первая программа на Elixir.