将变量从命令行绑定到测试groovy脚本

时间:2014-07-02 08:45:45

标签: java binding groovy command-line-interface

我有一个与GroovyScriptEngine结合使用的groovy脚本:

public static void main(String[] args) {
    GroovyScriptEngine gse = new GroovyScriptEngine(new String[] {"/home/user/tmp"});
    Binding varSet = new Binding();
    varSet.setVariable("testVar", "Hello World");
    gse.run("printHello.groovy", varSet);
}

这从java运行得很好。 printHello.groovy开始保持已经定义的所有绑定变量。脚本" /home/user/tmp/printHello.groovy"是这样的:

println("${testVar} !!!")

我想要的是能够测试这个脚本从命令行调用它,但我还没有找到一种方法将绑定变量传递给我的脚本。

$ groovy printHello.groovy [???]

这对测试非常有用。

1 个答案:

答案 0 :(得分:1)

您可以在脚本调用后传递所需的参数:

$ groovy groovyAuthDefault.groovy user pass

在脚本中,所有参数都可以通过args变量访问。 More info

这就是你要找的东西吗?

更新

找到解决方案,但它有一些限制,也许可以绕过它们但不确切知道如何。 正如我上面从命令行调用脚本时所写的那样你可以传递保存在args列表中的参数。问题在于GroovyScriptEngine没有用它的方法调用外部脚本 - 没有args列表所以它以MissingPropertyException失败。想法是设置假args

<强>的java

public static void main(String[] args) {
    GroovyScriptEngine gse = new GroovyScriptEngine(new String[] {"/home/user/tmp"});
    Binding varSet = new Binding();
    varSet.setVariable("testVar", "Hello World");
    varSet.setVariable("args", null); //null, empty string, whatever evaluates to false in groovy
    gse.run("printHello.groovy", varSet);
}

<强> printHello.groovy

if(args) {
    setBinding(new Binding(Eval.me(args[0])))
}
println("${testVar} !!!")

printHello.groovy args中进行检查。如果它的计算结果为true,则意味着从命令行调用了脚本并设置了新的Binding - 从传递的参数的第一个元素开始计算(普通groovy脚本扩展groovy.lang.Script。如果{{1} }计算结果为false表示脚本是使用args运行的。

命令行调用:

GroovyScriptEngine

也可以添加异常处理以及其他改进。希望有所帮助。