2012-07-23 11 views
5

Intento incrustar groovy en una gran aplicación Java.GroovyShell: ejecución incrustada

La aplicación Java debe cargar algunos scripts Groovy de utilidad al inicio.

La aplicación debería ejecutar otros scripts varias veces. También es necesario ingresar algún código en una GUI y ejecutarlo a petición del usuario.

El problema que estoy enfrentando es la siguiente:

Estoy cargando el script de inicio de la siguiente manera:

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

Supongamos que mi autoload.groovy contiene:

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

Esto funciona bien . Pero cuando quiero ejecutar un comando de usuario usando:

gShell.evaluate("prnt 66"); 

me sale el error: groovy.lang.MissingMethodException: No signature of method: Script2.prnt() is applicable for argument types: (java.lang.Integer) values: [66]

¿Cómo puede mi script de usuario de acceso a los métodos ya cargado?

Nota: También he intentado "autoload.prnt 88", y sigo recibiendo el error.

Respuesta

4

Cada evaluate llamada se compila y se ejecuta como un Script separada, y

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

define un método en la clase de secuencias de comandos generado a partir de autoload.groovy, que no es accesible desde el guión posterior "llamando". Sin embargo, los scripts ejecutados por el mismo GroovyShell comparten el mismo vinculante, por lo que puede almacenar valores en el enlace de un script y acceder a ellos en otro. Almacenar un valor en la unión es simplemente un caso de asignar el valor a una variable de otro modo no declarado:

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

Esto almacena un cierre en la variable vinculante prnt, y se puede llamar el cierre de otras secuencias de comandos en la misma cáscara . Tenga en cuenta que

def prnt = { m -> 

o

Closure prnt = { m -> 

haría no trabajo, porque el tipo def o hace que sea una declaración de variable local (privada a este script en particular) en lugar de una asignación a la unión.

Cuestiones relacionadas