3

我有 2 个脚本,我试图在其中测试传递一个参数,但它失败了。我检查了 GroovyScriptEngine 的文档,但它似乎没有处理我想要传递 arg 而不是属性值对(在绑定中)的情况。

这是我得到的错误:

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自己:

这会将发送到Testthrough 的参数按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 回答