Java GroovyShell:嵌入式执行
我正试图将groovy嵌入到一个大型Java应用程序中 Java应用程序应该在启动时加载一些实用程序Groovy脚本 然后,应用程序应多次运行其他脚本。还需要在GUI中输入一些代码,并在用户请求时执行 我面临的问题是: 我正在加载启动脚本,如下所示: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包含:
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 ->