3

引数の受け渡しをテストしようとしている 2 つのスクリプトがあり、失敗します。GroovyScriptEngine のドキュメントを調べましたが、(バインディングで) プロパティ値のペアではなく引数を渡したい場合を処理していないようです。

これが私が得るエラーです:

C:\AeroFS\Work\Groovy_Scripts>groovy scriptengineexample.groovy
hello, world
Caught: groovy.lang.MissingPropertyException: No such property: args 
        for class: hello
groovy.lang.MissingPropertyException: No such property: args for 
        class: hello
        at hello.run(hello.groovy:4)
        at Test.main(scriptengineexample.groovy:14)

ここに私のスクリプトがあります:

import groovy.lang.Binding;
import groovy.util.GroovyScriptEngine;
import groovy.util.ResourceException ;
import groovy.util.ScriptException ;
import java.io.IOException ;

public class Test {
  public static void main( String[] args ) throws IOException, 
             ResourceException, ScriptException {
    GroovyScriptEngine gse = new GroovyScriptEngine( [ '.' ] as String[] )
    Binding binding = new Binding();
    binding.setVariable("input", "world");
    gse.run("hello.groovy", binding);
    System.out.println( "Output: " + binding.getVariable("output") );
  }
}

そしてこれ:

//hello.groovy
println "hello.groovy"
for (arg in this.args ) {
  println "Argument:" + arg;
}
4

2 に答える 2

3

Hello は、 というバインディングで文字列配列を探していますargs。これは、コマンド ライン経由でスクリプトを実行すると自動的に提供されますが、そのコンテキスト外で実行する場合は、Binding自分自身に追加する必要があります。

Testこれにより、に送信された引数がそのまま渡されますHello

public class Test {
    public static void main(String[] args) {
        Binding b = new Binding()
        b.setVariable("args", args)
        Hello h = new Hello(b);
        h.run()
    }
}

特定の引数を送信する場合は、配列を自分で作成する必要があります。

public class Test {
    public static void main(String[] args) {
        Binding b = new Binding()
        b.setVariable("args", ["arg1", "arg2", "etc."])
        Hello h = new Hello(b)
        h.run()
    }
}
于 2013-04-17T19:23:56.943 に答える
3

さらに単純に、Binding クラスには、String[] を受け取るコンストラクターがあり、それを「args」として追加するので、次のようにすることができます。

public class Test {
    public static void main(String[] args) {
      new Hello(new Binding(args)).run();
    }
}
于 2013-05-07T06:57:50.257 に答える