groovy 実行可能ファイルを呼び出す上記の質問で最初に説明した方法は、2 番目の Java ランタイム インスタンスとクラス ローダーを呼び出しますが、効率的な方法は、Groovy スクリプトを Java クラスとして Java ランタイムに直接埋め込んで呼び出すことです。
Java から Groovy スクリプトを実行するには、次の 3 つの方法があります。
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
== hello.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 スクリプトがスクリプトとして実行され、引数を指定して明示的なメソッドを呼び出すのではなく、バインディング変数を使用して入力が渡されます。
注: この 3 番目のオプションは、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