3

Groovyをインストールしました。

ここに画像の説明を入力

そして、次のように、Java を使用して作成したコマンド プロンプトから groovy スクリプトを実行しようとしています。

Runtime.getRuntime().exec("groovy");

したがって、コマンド ラインに「groovy」と入力すると、次のようになります。

>>>groovy
Cannot run program "groovy": CreateProcess error=2, The system cannot find the file specified

何がうまくいかないのか、誰かが考えを持っていますか? Groovy の exec の実装を使用する必要がありますか? お気に入り:

def processBuilder=new ProcessBuilder("ls")
processBuilder.redirectErrorStream(true)
processBuilder.directory(new File("Your Working dir"))  // <--
def process = processBuilder.start()

私の推測では、Java の実装を使用するか、Groovy の実装を使用するかは問題ではありません。

では、groovy スクリプトを実行するにはどうすればよいでしょうか。

4

1 に答える 1

2

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

于 2013-11-30T22:28:51.413 に答える