我们可以Runtime.getRuntime()。exec(“groovy”);

时间:2013-10-08 18:50:58

标签: java groovy processbuilder

我安装了Groovy。

enter image description here

我正在尝试使用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脚本呢?

1 个答案:

答案 0 :(得分:2)

上面问题中最初描述的调用groovy可执行文件的方法调用第二个Java运行时实例和类加载器,而有效的方法是将Groovy脚本作为Java类直接嵌入Java运行时并调用它。

以下是从Java执行Groovy脚本的三种方法:

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脚本作为脚本运行,并使用绑定变量传入输入,而不是使用参数调用显式方法。

注意:第三个选项适用于希望将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