Groovy Tutorial sugli script per principianti

⚡ Riepilogo intelligente

Groovy Script è un linguaggio orientato agli oggetti per il Java piattaforma che compila in bytecode JVM. Aggiunge tipi dinamiciping, chiusure e sintassi concisa per Javae alimenta Jenkins oleodotti, Gradle costruisce e SoapUI affermazioni.

  • 🧩 Java compatibile: Più valido Java il codice viene compilato senza modifiche in Groovy, quindi il costo di apprendimento rimane molto basso.
  • Less piatto da portata: Una singola riga println sostituisce la classe, il metodo main e la chiamata System.out. Java richieste.
  • 🔀 Tipo dinamicoping: La parola chiave `def` consente a una variabile di contenere un numero intero e una stringa in fase di esecuzione.
  • 🔁 Cicli compatti: I metodi upto, times e step sostituiscono in un'unica riga i prolissi cicli for in stile C.
  • 📦 Collezioni native: Le liste e le mappe hanno una sintassi letterale, oltre a funzioni di supporto come pop, keySet e sort.
  • 🧠 chiusure: I blocchi di codice agiscono come oggetti, accettano parametri, restituiscono valori e si annidano all'interno di altre closure.
  • ⚙️ Tre strumenti: groovysh fornisce una shell, groovyConsole fornisce un'interfaccia grafica e groovy esegue direttamente i file di script.

Groovy Tutorial sugli script per principianti

Che cos'è un Groovy Copione?

Apache Groovy è un linguaggio orientato agli oggetti, Java linguaggio di programmazione compatibile con la sintassi costruito per il Java piattaforma. Questo linguaggio dinamico ha molte caratteristiche simili a PythonRuby, Smalltalk e Perl. Groovy il codice sorgente viene compilato in Java bytecode, quindi funziona su qualsiasi piattaforma in cui è presente un Java La macchina virtuale è installata. Groovy svolge anche molto lavoro dietro le quinte, il che lo rende più agile e dinamico rispetto al semplice Java.

A Groovy copione è semplicemente un .groovy file contenente dichiarazioni che Groovy avvolge in una classe generata prima di eseguirla. Ecco perché puoi eseguire un file di una sola riga senza scrivere una classe o un main metodo. Groovy può quindi essere utilizzato come linguaggio di scripting per il Java piattaforma pur offrendo le funzionalità aziendali di JavaAggiunge funzionalità di produttività come il supporto DSL, le chiusure e i tipi dinamici opzionalipingA differenza di altre lingue, è progettato come complemento di Java, non un sostituto.

Suggerimento: Groovy La versione 5.0 è l'attuale versione stabile e ha come target JDK 11 e versioni successive. Groovy La versione 4.0 rimane disponibile per i progetti JDK 8 e Groovy La versione 6.0 è ancora in fase alpha per JDK 17. Controlla sempre la tabella dei requisiti di sistema sulla pagina di download ufficiale prima di scegliere una versione.

Perché Groovy?

Ecco i principali motivi per cui dovresti usare e imparare Groovy:

  • Groovy è un linguaggio agile e dinamico.
  • Si integra perfettamente con tutti quelli esistenti Java oggetti e librerie.
  • Sembra facile e naturale Java sviluppatori.
  • Il codice è più conciso e più significativo dell'equivalente Java codice.
  • Puoi usarlo quanto vuoi all'interno Java applicazioni.
  • Funziona con lo standard Java Macchina virtuale, quindi non è richiesto un runtime separato.

Groovy Storia

  • 2003: Iniziato da James StracHan e Bob McWhiravere.
  • 2004: Inviato al Java Procedura comunitaria denominata JSR 241, che è stata successivamente ritirata.
  • 2005: Riportato in onda track di Jeremy Rayner e Guillaume Laforge.
  • 2007: Groovy 1.0 rilasciato.
  • 2012: Groovy 2.0 rilasciato.
  • 2014: Groovy È stata rilasciata la versione 2.3 con supporto ufficiale per JDK 8.
  • 2015: Groovy è diventato un progetto di alto livello presso Apache Software Foundation.
  • 2022: Groovy 4.0 rilasciato, con le coordinate Maven spostate a org.apache.groovy.
  • 2025: Groovy Versione 5.0 rilasciata per JDK 11 e versioni successive.

Caratteristiche principali dell'app Groovy

  • Lettere per liste, mappe, intervalli ed espressioni regolari.
  • Multimethods (assegnazione di metodi a runtime) e metaprogrammazione.
  • Groovy classi e script sono solitamente memorizzati in .groovy File.
  • Gli script contengono Groovy istruzioni senza alcuna dichiarazione di classe.
  • Gli script possono contenere anche definizioni di metodi al di fuori delle definizioni di classe.
  • Groovy il codice può essere compilato e completamente integrato con un tradizionale Java applicazione.
  • Supporto a livello di linguaggio per mappe, elenchi ed espressioni regolari.
  • Supporto per chiusure, tipo dinamicopinge il protocollo dei meta-oggetti.
  • Supporto sia per tipi statici che dinamiciping, oltre al sovraccarico dell'operatore.
  • Controllo statico opzionale del tipo tramite @TypeChecked and @CompileStatic annotazioni.

Come installare Groovy

Passo 1) Assicurati di averlo Java installato.

Passo 2) Vai su https://groovy.apache.org/download.html e fare clic sul Windows collegamento di installazione.

Groovy pagina di download con il link per l'installazione

Nota: è anche possibile installare Groovy dal file Zip binario, tramite un gestore di pacchetti come SDKMAN!, Homebrew, Scoop o Chocolatey, oppure come plugin per il tuo Java IDE. In questo Groovy procedura dettagliata ci atterremo alla Windows installatore.

Passo 3) Avvia il programma di installazione scaricato. Seleziona la lingua e fai clic su OK.

Groovy finestra di dialogo per la selezione della lingua dell'installatore

Passo 4) Nella schermata di benvenuto, fai clic su AVANTI.

Groovy schermata di benvenuto dell'installatore

Passo 5) Accetto i termini della licenza.

Groovy schermata del contratto di licenza di installazione

Passo 6) Seleziona i componenti che desideri installare e fai clic su AVANTI.

Groovy schermata di selezione dei componenti del programma di installazione

Passo 7) Seleziona la directory di installazione e fai clic su AVANTI.

Groovy schermata della directory di installazione del programma di installazione

Passo 8) Seleziona la cartella Menu Start e fai clic su AVANTI.

Groovy schermata della cartella del menu Start dell'installatore

Passo 9) Una volta completata l'installazione, lasciare i percorsi predefiniti e fare clic su AVANTI.

Groovy schermata del percorso dell'ambiente di installazione

Passo 10) Conferma le opzioni di associazione dei file e fai clic su AVANTI.

Groovy schermata di associazione dei file di installazione

Passo 11) Nel menu Start, cerca Groovy Console per confermare l'installazione.

Avvia Menu cerca mostrando il Groovy Scorciatoia da console

⚠️ Attenzione: Migliori Windows Il programma di installazione è un artefatto contribuito dalla comunità, non una versione ufficiale di Apache. Se la tua organizzazione richiede download di Apache firmati, usa la distribuzione Zip binaria e verifica il suo .asc firma e .sha256 invece del checksum.

Groovy Ciao esempio mondiale

Supponiamo di voler stampare la semplice stringa "Hello World" in JavaIl codice sarebbe simile a questo.

public class Demo {
    public static void main(String[] args) {
        System.out.println("Hello World");
    }
}

Produzione:

Hello World

Il codice sopra è valido in entrambi Java and Groovy, perché Groovy accetta quasi tutti Java sintassi. Il vantaggio con Groovy Il vantaggio è che si può eliminare la dichiarazione della classe, il metodo pubblico e la chiamata print completa, ottenendo lo stesso risultato con una sola riga.

println "Hello World"

Produzione:

Hello World
  • Non è necessario il punto e virgola.
  • Non c'è bisogno di una classe o di un main metodo.
  • System.out.println è ridotto a println.

Groovy Variabili

In JavaIl binding statico è obbligatorio, il che significa che il tipo di una variabile deve essere dichiarato in anticipo.

public class Demo {
    public static void main(String[] args) {
        int x = 104;
        System.out.println(x);
        //x = "Guru99";
    }
}

Produzione:

104

Nell'esempio precedente, il tipo della variabile viene dichiarato in anticipo utilizzando la parola chiave intSe dovessi dichiarare un numero a virgola mobile, useresti la parola chiave float or double.

Se provi ad assegnare un valore String a un int (rimuovendo il commento dalla riga 5), ​​si otterrà il seguente errore di compilazione.

Demo.java:5: error: incompatible types: String cannot be converted to int
x = "Guru99";

In contrasto, Groovy supporta la tipologia dinamicapingLe variabili vengono definite utilizzando la parola chiave defe il tipo non deve essere dichiarato in anticipo. Il runtime determina automaticamente il tipo della variabile, e puoi persino modificarlo in seguito.

def x = 104
println x.getClass()
x = "Guru99"
println x.getClass()

Produzione:

class java.lang.Integer
class java.lang.String

In Groovy È possibile creare anche stringhe multilinea. Basta assicurarsi di racchiudere la stringa tra virgolette triple.

def x = """Groovy
at
Guru99"""
println x

Produzione:

Groovy
at
Guru99

Nota: È ancora possibile utilizzare tipi espliciti come byte, short, inte long in GroovyMa una volta dichiarato esplicitamente il tipo, non è possibile modificarlo dinamicamente.

int x = 104
println x
x = "Guru99"

Produzione:

104
Caught: org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object 'Guru99' with class 'java.lang.String' to class 'int'
org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object 'Guru99' with class 'java.lang.String' to class 'int'
    at jdoodle.run(jdoodle.groovy:3)
Command exited with non-zero status 1

Groovy OperaTors

Un operatore è un simbolo che indica al compilatore di eseguire una specifica manipolazione matematica o logica. Groovy supporta le seguenti cinque famiglie di operatori.

  • Operatori aritmetici: aggiungere (+), sottrarretract (-), moltiplica (*), dividi (/), modulo (%), incrementa (++), decrementa (–).
  • Operatori relazionali: uguale a (==), diverso da (!=), minore di (<), minore o uguale a (<=), maggiore di (>), maggiore o uguale a (>=).
  • Operatori logici: e (&&), oppure (||), non (!).
  • Operatori bit a bit: e (&), o (|), OR esclusivo (^), complemento (~).
  • Operatori di assegnazione: assegnare (=) e le forme composte (+=), (-=), (*=), (/=), (%=).

Groovy aggiunge alcuni operatori che Java non lo ha, e rimuovono un sacco di codice ripetitivo per il controllo dei valori nulli.

Operator Descrizione
?. Navigazione sicura. Restituisce null invece di generare una NullPointerException quando il lato sinistro è null.
?: Operatore Elvis. Restituisce il lato sinistro se è vero, altrimenti il ​​lato destro.
<=> Operatore di astronave. Delega a compareTo ed è utile all'interno delle closure di ordinamento.
==~ Corrispondenza con espressione regolare. Restituisce true solo quando l'intera stringa corrisponde al pattern.

Groovy Loops

In Java, definiresti un ciclo di conteggio come segue.

public class Demo {
    public static void main(String[] args) {
        for (int x = 0; x <= 5; x++) {
            System.out.println(x);
        }
    }
}

Produzione:

0
1
2
3
4
5

Puoi ottenere lo stesso risultato in Groovy con la upto metodo, che comprende entrambi i limiti.

0.upto(5) { println "$it" }

Produzione:

0
1
2
3
4
5

Qui it è il parametro implicito della closure e contiene il valore dell'iterazione corrente. Si consideri il seguente codice.

2.upto(4) { println "$it" }

Produzione:

2
3
4

È inoltre possibile utilizzare il times metodo. Inizia sempre da 0 e si ferma a un numero prima del numero su cui viene chiamato, quindi servono 6 per stampare da 0 a 5.

6.times { println "$it" }

Produzione:

0
1
2
3
4
5

Ora supponiamo di voler stampare 0, 2 e 4 con un Java per loop.

public class Demo {
    public static void main(String[] args) {
        for (int x = 0; x <= 5; x=x+2) {
            System.out.println(x);
        }
    }
}

Produzione:

0
2
4

È possibile utilizzare il step metodo per ottenere lo stesso risultato. Il secondo argomento è l'incremento e il primo argomento è un limite superiore esclusivo.

0.step(5, 2) { println "$it" }

Produzione:

0
2
4

Groovy Decision Making

Groovy riutilizza il Java istruzioni condizionali e aggiunge una flessibilità molto maggiore switchLa tabella seguente riassume le opzioni.

dichiarazione Descrizione
istruzione if Come in JavaIl corpo dell'istruzione if viene eseguito quando la condizione è vera.
istruzione if/else La condizione nell'istruzione if viene valutata per prima. Se è vera, vengono eseguite le istruzioni nel blocco if e il blocco else viene saltato. Se è falsa, vengono eseguite invece le istruzioni nel blocco else.
Istruzione if annidata Si usa quando è necessario testare un'ulteriore condizione all'interno di un blocco if.
istruzione switch Una catena di if-else annidati diventa illeggibile quando ci sono molte condizioni. L'istruzione switch rende la stessa logica più facile da leggere. GroovyUn'etichetta di caso può essere un valore, una classe, un intervallo, un'espressione regolare o una closure.
Istruzione switch annidata Groovy Consente inoltre di inserire un'istruzione switch all'interno di un'altra.

Groovy Lista

Una struttura di elenco consente di memorizzare una raccolta di elementi di dati. In GroovyUna lista contiene una sequenza di riferimenti a oggetti e conserva la posizione di ciascun elemento in tale sequenza. Un letterale di lista è scritto come una serie di oggetti separati da virgole e racchiusi tra parentesi quadre.

Esempi di Groovy liste:

  • Un elenco di stringhe: ['Angular', 'Nodejs']
  • Elenco di riferimenti a oggetti misti: ['Groovy', 2, 4, 2.6]
  • Un elenco di valori interi: [16, 17, 18, 19]
  • Una lista vuota: []

I seguenti metodi di elenco sono disponibili in Groovy.

Metodo Descrizione
Inserisci() Aggiunge un nuovo valore alla fine dell'elenco.
contiene() Restituisce true se la lista contiene un determinato valore.
ottenere () Restituisce l'elemento nella posizione specificata.
è vuoto() Restituisce true se la lista non contiene elementi.
meno() Crea una nuova lista composta dagli elementi della lista originale, escludendo quelli specificati nella raccolta data.
più() Crea una nuova lista composta dagli elementi dell'originale insieme a quelli presenti nella collezione specificata.
pop () Rimuove l'ultimo elemento dalla lista e lo restituisce.
rimuovere() Rimuove l'elemento nella posizione specificata.
inversione() Crea una nuova lista che inverte gli elementi della lista originale.
dimensione() Restituisce il numero di elementi presenti nella lista.
ordinare() Restituisce una copia ordinata della lista.

Considera quanto segue Groovy esempio di script.

def y = ["Guru99", "is", "migliori", "for", "Groovy"]
println y
y.add("Learning")
println(y.contains("is"))
println(y.get(2))
println(y.pop())

Produzione:

[Guru99, is, migliori, for, Groovy]
true
migliori
Learning

La prima riga stampa l'elenco originale di cinque elementi, perché add() non è ancora stato eseguito. get(2) restituisce “migliori” da Groovy Gli elenchi sono indicizzati a partire da zero e pop() restituisce "Apprendimento" perché quell'elemento è stato aggiunto per ultimo.

Groovy Maps

A Groovy Una mappa è una raccolta di coppie chiave-valore. Le chiavi non necessitano di virgolette quando sono semplici identificatori, il che mantiene i letterali della mappa molto compatti.

Esempi di Groovy mappe:

  • [tutorial: 'Java', language: 'Groovy'] è una raccolta di due coppie chiave-valore.
  • [:] rappresenta una mappa vuota.

Ecco un elenco dei metodi di mappatura disponibili in Groovy.

Metodo Descrizione
contieneChiave() Verifica se la mappa contiene la chiave specificata.
ottenere () Cerca la chiave nella mappa e restituisce il valore corrispondente. Se non viene trovata alcuna voce, restituisce null.
mazzo di chiavi() Restituisce l'insieme delle chiavi presenti nella mappa.
Mettere() Associa il valore specificato alla chiave indicata. Se la mappa conteneva già una mappaping Per quella chiave, il vecchio valore viene sostituito.
dimensione() Restituisce il numero di mappa chiave-valorepings.
valori () Restituisce una vista della raccolta dei valori.

Groovy esempio:

def y = [fName:'Jen', lName:'Cruise', sex:'F']
print y.get("fName")

Produzione:

Jen

Groovy chiusure

A Groovy Una closure è un blocco di codice incapsulato in un oggetto. Si comporta come un metodo o una funzione, ma può essere memorizzata in una variabile e passata come qualsiasi altro valore.

Esempio di una chiusura semplice:

def myClosure = {
    println "My First Closure"
}
myClosure()

Produzione:

My First Closure

Una closure può accettare parametri. L'elenco degli identificatori è separato da virgole, con una freccia (->) che indica la fine dell'elenco dei parametri.

def myClosure = {
    a, b, c ->
    y = a + b + c
    println y
}
myClosure(1, 2, 3)

Produzione:

6

Una closure può anche restituire un valore.

def myClosure = {
    a, b, c ->
    return (a + b + c)
}
println(myClosure(1, 2, 3))

Produzione:

6

Quando non si dichiara un elenco di parametri, Groovy fornisce un singolo parametro implicito denominato it. Le closure possono anche essere passate ad altre closure, ed è esattamente così che funzionano i metodi di raccolta come each, collecte findAll lavoro.

Groovy Strumenti

Esamineremo tre strumenti importanti forniti con Groovy distribuzione:

  1. fantastico: Esegue il codice in modo interattivo dalla riga di comando.
  2. groovyConsole: Una finestra grafica per l'esecuzione interattiva del codice.
  3. fantastico: esegue Groovy file di script, nello stesso modo in cui eseguiresti un Perl o Python script.

Groovysh

  • Una shell a riga di comando.
  • Ti aiuta a eseguire Groovy codice interattivo.
  • Consente di inserire singole istruzioni o interi script.

Lo screenshot qui sotto mostra groovysh che valuta le espressioni una riga alla volta.

shell della riga di comando groovysh in esecuzione Groovy dichiarazioni

Groovy consolle

  • Un'interfaccia Swing che funge da minimale Groovy redattore dello sviluppo.
  • Ti consente di scrivere ed eseguire Groovy codice interattivo.
  • Ti aiuta a caricare ed eseguire Groovy file di script.

Nel Groovy Nella console sottostante, lo script viene digitato nel riquadro superiore e il risultato appare nel riquadro inferiore.

Groovy Console editor Swing con pannelli di script e output

Groovy

Migliori groovy il comando è il processore che esegue Groovy programmi e script. Compila il codice sorgente in bytecode in memoria e lo esegue in un unico passaggio, quindi non è necessaria una fase di compilazione separata. Può anche essere utilizzato per testare semplici Groovy espressioni direttamente dal terminale, come mostrato di seguito.

Comando Groovy per eseguire uno script dal terminale

Dove Groovy Viene utilizzato in progetti reali

La maggior parte degli sviluppatori incontra Groovy Non come linguaggio a sé stante, ma come livello di scripting all'interno di uno strumento già in esecuzione. Sapere dove compare rende molto più semplice inserire la sintassi di cui sopra.

Chiavetta Come Groovy viene usato
Jenkins Le pipeline dichiarative e scriptate sono scritte in un Groovy DSL e le librerie condivise sono semplici Groovy classi.
Gradle Il classico build.gradle file è un file Groovy script, motivo per cui si legge in modo più compatto di un Maven POM o un Formica File di compilazione.
SoapUI Groovy Le fasi dello script e le asserzioni dello script gestiscono i dati dinamici delle richieste e i controlli personalizzati delle risposte.
Spock A Groovy Framework di test i cui blocchi given-when-then e tabelle di dati sono ampiamente utilizzati per i test unitari della JVM.
Elasticsearch e Grails Grails crea applicazioni web complete su Groovye diversi strumenti di dati accettano Groovy per script personalizzati.

In test di automazione team questo è importante due volte: il job CI che esegue la suite e i test stessi possono essere entrambi Groovy, quindi un singolo linguaggio copre la logica di collegamento della pipeline e la logica di asserzione.

Groovy Vs. Java

Groovy Java
Il modificatore di accesso predefinito è pubblico, quindi un metodo senza modificatore è accessibile al di fuori della sua classe e del suo pacchetto. Il modificatore di accesso predefinito è package-private, quindi i campi, i metodi e le classi senza modificatore sono visibili solo all'interno del loro pacchetto.
I metodi getter e setter vengono generati automaticamente per le proprietà della classe. È necessario definire autonomamente i metodi getter e setter per i campi.
Groovy Consente la sostituzione di variabili all'interno di stringhe racchiuse tra virgolette doppie. Java non supporta l'interpolazione di stringhe.
Le informazioni sul tipo sono facoltative. Le informazioni sul tipo sono obbligatorie.
Le frasi non devono necessariamente terminare con un punto e virgola. Ogni frase termina con un punto e virgola.
Groovy incapsula automaticamente ogni script in una classe Script generata. Per rendere una classe eseguibile, è necessario un metodo main.
Tutto è pubblico e dinamico per impostazione predefinita, ma @CompileStatic Ripristina Java-velocità e verifica del livello. Tutto viene compilato staticamente e verificato in fase di compilazione.

Miti su Groovy

Mito Realtà
Groovy può essere utilizzato solo per la creazione di script. È eccellente per lo scripting, ma viene anche compilato in classi ordinarie che è possibile utilizzare in qualsiasi applicazione JVM.
Groovy È incentrato sulle closure, quindi è semplicemente un linguaggio di programmazione funzionale. Groovy Prende in prestito idee da linguaggi funzionali come Lisp e Clojure, ma rimane essenzialmente un linguaggio orientato agli oggetti.
Groovy È utile solo per lo sviluppo guidato dai test. Groovy è un'ottima soluzione per il TDD con Spock, ma non è certo l'unico motivo per utilizzarla.
Hai solo bisogno Groovy se vuoi usare Grails. Grails è un potente framework per lo sviluppo web, ma Gradle, Jenkinse Spock usano tutti Groovy senza di essa.

Contro dell'utilizzo Groovy

  • JVM e Groovy L'avvio dello script è lento, il che ne limita l'utilizzo per la creazione rapida di script a livello di sistema operativo.
  • Groovy Non è ampiamente adottato al di fuori delle comunità incentrate sulla JVM.
  • È scomodo da usare Groovy senza un IDE che ne comprenda le caratteristiche dinamiche.
  • Il dispacciamento dinamico può rendere Groovy codice più lento rispetto all'equivalente Java codice a meno che non si applichi @CompileStatic.
  • Groovy i programmi potrebbero aver bisogno di più memoria rispetto al semplice Java programmi.
  • Conoscenza di Java è di fatto un prerequisito.

Una volta che ti senti a tuo agio con Groovy sintassi, il passo successivo naturale è l'ecosistema che la circonda. Rafforza i fondamenti con la Java lezione, quindi guarda come Groovy gli script guidano le build e le distribuzioni in Jenkins, confronta gli strumenti di compilazione con Maven and Anti Apachee scoprire come Groovy le affermazioni rientrano in Selenium e suite di test API.

DOMANDE FREQUENTI

Groovy La versione 5.0 è destinata a JDK 11 e versioni successive. Groovy La versione 4.0 supporta ancora JDK 8 e il processo in corso Groovy La versione 6.0 è destinata a JDK 17. Prima di scegliere una versione, consulta la tabella dei requisiti di sistema sulla pagina di download ufficiale di Apache.

No. Il comando groovy compila un file .groovy in bytecode in memoria e lo esegue immediatamente. Puoi comunque compilare in anticipo con groovyc quando vuoi file .class riutilizzabili da impacchettare all'interno di un Java applicazione.

Sì, Apache Groovy Il software è rilasciato sotto licenza Apache 2.0, pertanto l'uso commerciale, la modifica e la ridistribuzione sono consentiti gratuitamente. Ai software ridistribuiti si applicano solo i consueti obblighi di attribuzione e di notifica della licenza.

Groovy è il linguaggio di programmazione. Grails è un framework web full-stack scritto in Groovy. È possibile utilizzare Groovy per file di build, pipeline o test senza mai installare Grails, ma Grails non può esistere senza Groovy.

Gestiscono bene idiomi comuni come closure, metodi di raccolta e fasi della pipeline. Esegui sempre prima gli script generati in groovyConsole, perché a volte i modelli si fondono Java sintassi con Groovy scorciatoie o inventare metodi inesistenti.

Incolla lo stack trace lo script in un assistente per far emergere cause probabili come un GroovyUn'eccezione CastException, un'approvazione della sandbox mancante o un delegato di chiusura errato. Considera ogni suggerimento come un'ipotesi e verificalo confrontandolo con il log di compilazione reale.

Riassumi questo post con: