2012-07-23 13 views
5

Sto cercando di incorporare Groovy in una grande applicazione Java.GroovyShell: esecuzione incorporata

L'applicazione Java dovrebbe caricare alcuni script Groovy di utilità all'avvio.

L'applicazione dovrebbe quindi eseguire altri script più volte. È inoltre necessario inserire del codice in una GUI ed eseguirlo su richiesta dell'utente.

Il problema che sto affrontando è questo:

Sto caricando lo script di avvio in questo modo:

GroovyShell gShell = new GroovyShell(); 
gShell.evaluate(new FileReader("scripts/autoload.groovy")); 

Supponiamo che la mia autoload.groovy contiene:

def prnt(m) { 
    println("From Groovy: " + m); 
} 

Questo funziona bene . Ma quando voglio eseguire un comando utente che utilizza:

gShell.evaluate("prnt 66"); 

ottengo l'errore: groovy.lang.MissingMethodException: No signature of method: Script2.prnt() is applicable for argument types: (java.lang.Integer) values: [66]

Come può il mio accesso script utente i metodi già caricato?

Nota: ho anche provato "autoload.prnt 88" e ho ancora ricevuto l'errore.

risposta

4

Ogni evaluate chiamata viene compilato ed eseguito come un separato Script e

def prnt(m) { 
    println("From Groovy: " + m); 
} 

definisce un metodo nella classe script generato da autoload.groovy, che non è accessibile dalla successiva script "chiamando". Tuttavia, gli script gestiti dallo stesso GroovyShell condividono lo stesso binding, quindi è possibile memorizzare i valori nell'associazione da uno script e accedervi in ​​un altro. Memorizzazione di un valore nel legame è semplicemente un caso di assegnare il valore di una variabile altrimenti non dichiarato:

prnt = { m -> 
    println("From Groovy: " + m); 
} 

Questo memorizza una chiusura nella variabile vincolante prnt, ed è possibile chiamare la chiusura da altri script nella stessa shell . Si noti che

def prnt = { m -> 

o

Closure prnt = { m -> 

sarebbe non lavoro, perché il tipo di def o lo rende una dichiarazione di variabile locale (privato a questo particolare script), piuttosto che un incarico alla rilegatura.

Problemi correlati