上述问题中最初描述的调用Groovy可执行文件的方法会调用第二个Java运行时实例和类加载器,而更有效的方法是将Groovy脚本直接嵌入到Java运行时作为Java类并调用它。
以下是从Java执行Groovy脚本的三种方法:
1)最简单的方法是使用
GroovyShell:
这里是一个示例Java主程序和目标Groovy脚本来调用:
== TestShell.java ==
import groovy.lang.Binding;
import groovy.lang.GroovyShell;
Binding binding = new Binding();
binding.setVariable("input", "world");
GroovyShell shell = new GroovyShell(binding);
Object retVal = shell.evaluate(new File("hello.groovy"));
System.out.println("x=" + binding.getVariable("x"));
System.out.println("return=" + retVal);
== 你好.groovy ==
println "Hello $input"
x = 123 // script-scoped variables are available via the GroovyShell
return "ok"
2) 接下来使用
GroovyClassLoader 将脚本解析为一个类,然后创建它的实例。这种方法将 Groovy 脚本视为一个类,并像任何 Java 类一样调用其方法。
GroovyClassLoader gcl = new GroovyClassLoader();
Class clazz = gcl.parseClass(new File("hello.groovy");
Object aScript = clazz.newInstance();
最后,您可以创建
GroovyScriptEngine并使用绑定传递对象作为变量。这将以脚本方式运行Groovy脚本,并使用绑定变量传递输入,而不是使用带参数的显式方法调用。
注意:此第三个选项适用于想要将Groovy脚本嵌入服务器并在修改时重新加载它们的开发人员。
import groovy.lang.Binding;
import groovy.util.GroovyScriptEngine;
String[] roots = new String[] { "/my/groovy/script/path" };
GroovyScriptEngine gse = new GroovyScriptEngine(roots);
Binding binding = new Binding();
binding.setVariable("input", "world");
gse.run("hello.groovy", binding);
System.out.println(binding.getVariable("output"));
注意:您必须将 groovy_all jar 包含在 CLASSPATH 中,以使这些方法起作用。
参考:
http://groovy.codehaus.org/Embedding+Groovy