Java GroovyShell:嵌入式执行

Java GroovyShell:嵌入式执行,java,groovy,groovyshell,Java,Groovy,Groovyshell,我正试图将groovy嵌入到一个大型Java应用程序中 Java应用程序应该在启动时加载一些实用程序Groovy脚本 然后,应用程序应多次运行其他脚本。还需要在GUI中输入一些代码,并在用户请求时执行 我面临的问题是: 我正在加载启动脚本,如下所示: GroovyShell gShell = new GroovyShell(); gShell.evaluate(new FileReader("scripts/autoload.groovy")); 假设我的autoload.groovy包含:

我正试图将groovy嵌入到一个大型Java应用程序中

Java应用程序应该在启动时加载一些实用程序Groovy脚本

然后,应用程序应多次运行其他脚本。还需要在GUI中输入一些代码,并在用户请求时执行

我面临的问题是:

我正在加载启动脚本,如下所示:

GroovyShell gShell = new GroovyShell();
gShell.evaluate(new FileReader("scripts/autoload.groovy"));
假设我的autoload.groovy包含:

def prnt(m) {
    println("From Groovy: " + m);
}
这个很好用。但当我想使用以下命令运行用户命令时:

gShell.evaluate("prnt 66");
我得到一个错误:
groovy.lang.MissingMethodException:方法Script2.prnt()的签名不适用于参数类型:(java.lang.Integer)值:[66]

我的用户脚本如何访问已加载的方法


注意:我也尝试过“autoload.prnt 88”,但仍然出现错误。

每个
evaluate
调用都作为单独的
脚本编译和运行,并且

def prnt(m) {
    println("From Groovy: " + m);
}
在从
autoload.groovy
生成的脚本类中定义一个方法,该方法不能从后续的“调用”脚本访问。但是,由同一
GroovyShell
运行的脚本共享相同的绑定,因此您可以在绑定中存储来自一个脚本的值,并在另一个脚本中访问它们。在绑定中存储值只是将值分配给未声明的变量:

prnt = { m ->
    println("From Groovy: " + m);
}
这将在绑定变量
prnt
中存储闭包,您可以从同一shell中的其他脚本调用闭包。注意

def prnt = { m ->

不起作用,因为
def
或类型使其成为局部变量声明(此特定脚本专用),而不是绑定的赋值

Closure prnt = { m ->