Definicja #
Groovy (Apache Groovy) to dynamiczny, obiektowo zorientowany język programowania dla platformy JVM, stworzony przez Jamesa Strachana w 2003 roku. Jest w pełni interoperacyjny z Javą — Groovy kompiluje się do bytecode JVM, może importować dowolne biblioteki Java i być importowany z kodu Java.
Kluczowe cechy Groovy:
- Dynamiczne typowanie — zmienne mogą być deklarowane jako
defbez określania typu; opcjonalne typowanie statyczne (@TypeChecked,@CompileStatic) - Zwięzła składnia — opcjonalne średniki, opcjonalne
return, uproszczone gettery/settery, string interpolacja"Hello ${name}" - Closures — bloki kodu jako obiekty (podobne do lambd Java, ale potężniejsze); podstawa DSL w Groovy
- GStrings — template strings z interpolacją wyrażeń (
"${obj.property}") - Builders — mechanizm DSL do tworzenia strukturalnych konfiguracji (XML, HTML, JSON builders)
- Metaprogramowanie — dynamiczne dodawanie metod do klas w runtime, GroovyObject, kategorie
Główne zastosowania Groovy:
- Jenkins pipelines — Jenkinsfile pisany w Groovy DSL (zarówno Declarative, jak i Scripted Pipeline)
- Gradle — system budowania projektów Java/Android używa Groovy DSL (lub Kotlin DSL) w plikach
build.gradle - Grails — framework webowy dla Groovy (odpowiednik Ruby on Rails dla JVM)
- Spock — framework testowy dla Java/Groovy, ceniony za czytelność specyfikacji BDD
Zastosowania #
Groovy stosuje się do:
- Pisania pipelinów CI/CD w Jenkinsie — Jenkinsfile w Groovy DSL definiuje etapy build, test i deploy
- Konfiguracji projektów Java i Android — pliki
build.gradlew Groovy DSL (Gradle) - Testowania aplikacji Java — framework Spock (Groovy) do eleganckich testów BDD dla kodu Java
- Skryptowania w środowiskach JVM — szybkie skrypty Groovy bez konieczności tworzenia pełnych projektów Java
- Aplikacji webowych na JVM — framework Grails jako alternatywa dla Spring Boot z konwencją-nad-konfiguracją
Ścieżka nauki #
Groovy jest najczęściej uczony w kontekście konkretnego narzędzia (Jenkins lub Gradle) — rzadko jako pierwszy język programowania.
Zacznij od:
- Podstawy składni Groovy:
def, GStrings, listy i mapy (groovsh — interaktywna konsola) - Closures: definicja, przekazywanie jako argumenty,
itjako domyślny parametr - Groovy jako skrypt Jenkinsa: podstawy Scripted Pipeline (
node { stage { } }) - Declarative Pipeline — nowoczesna, strukturalna składnia Jenkinsfile
- Wspólne biblioteki Jenkins (Shared Libraries) — współdzielenie kodu Groovy między pipeline'ami
Następnie pogłębiaj:
- Gradle — pliki
build.gradlew Groovy DSL; tasks, plugins, dependency management - Spock Framework — pisanie testów BDD dla Javy w Groovy; bloki
given/when/then, parametryzacja - Jeśli interesujesz się Groovy jako głównym językiem — poznaj Grails jako framework webowy
- Migracja: Gradle od wersji 8 preferuje Kotlin DSL (
build.gradle.kts) nad Groovy DSL
FAQ #
- Czy muszę uczyć się Groovy by pisać pipeline Jenkinsa?
- Tak — Jenkinsfile używa składni Groovy (zarówno Declarative, jak i Scripted Pipeline). Nie musisz być ekspertem Groovy; podstawy (zmienne, pętle, closures, warunki) wystarczają do pisania większości pipelinów. Złożone, wielokrotnie używane logiki wymagają jednak Shared Libraries pisanych w pełnym Groovy.
- Czym różni się Groovy od Javy?
- Groovy jest w pełni kompatybilny z Javą — każdy kod Java jest (prawie) poprawnym kodem Groovy. Groovy dodaje dynamiczne typowanie (def), string interpolację, closures, opcjonalne średniki i zwięzlejszą składnię. Groovy jest bardziej zwięzły i skryptowy; Java jest bardziej wydajna i typowana statycznie.
- Czy Groovy jest jeszcze aktywnie rozwijany?
- Tak — Apache Groovy jest aktywnym projektem open-source (aktualna wersja 4.x). Jednak jego popularność jako samodzielnego języka maleje; jest używany głównie przez Jenkinsa i Gradle. Gradle aktywnie promuje migrację do Kotlin DSL (build.gradle.kts), co może zmniejszyć znaczenie Groovy DSL w przyszłości.
- Co to jest Spock Framework?
- Spock to framework testowy dla aplikacji Java i Groovy pisany w Groovy. Wyróżnia się czytelną strukturą testów BDD z blokami given/when/then i potężną parametryzacją (where: tables). Jest alternatywą dla JUnit z bardziej ekspresywną składnią specyfikacji zachowania.