上面问题中最初描述的调用 groovy 可执行文件的方式调用第二个 Java 运行时实例和类加载器,而有效的方法是将 Groovy 脚本作为 Java 类直接嵌入到 Java 运行时中并调用它。
以下是从 Java 执行 Groovy 脚本的三种方法:
1)最简单的方法是使用GroovyShell:
这是一个示例 Java 主程序和要调用的目标 Groovy 脚本:
== TestShell.java ==
import groovy.lang.Binding;
import groovy.lang.GroovyShell;
// call groovy expressions from Java code
Binding binding = new Binding();
binding.setVariable("input", "world");
GroovyShell shell = new GroovyShell(binding);
Object retVal = shell.evaluate(new File("hello.groovy"));
// prints "hello world"
System.out.println("x=" + binding.getVariable("x")); // 123
System.out.println("return=" + retVal); // okay
== 你好.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();
// probably cast the object to an interface and invoke methods on it
3) 最后,您可以创建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"));
注意:您必须在 CLASSPATH 中包含 groovy_all jar 才能使这些方法起作用。
参考: http: //groovy.codehaus.org/Embedding+Groovy