java - 我们可以 Runtime.getRuntime().exec ("groovy");

标签 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 脚本呢?

最佳答案

上述问题中最初描述的调用 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

== 你好.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并使用绑定(bind)将对象作为变量传递。这会将 Groovy 脚本作为脚本运行,并使用绑定(bind)变量传入输入,而不是使用参数调用显式方法。

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

关于java - 我们可以 Runtime.getRuntime().exec ("groovy");,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19255874/

相关文章:

java - 在 Java Web 应用程序中将数据插入数据库的最佳方式是什么??

java - eXist-db 从同一集合的许多 XML 中获取数据

java - 如何阻止 JsonBuilder 排列字段顺序

java - Java中打开带参数的exe,不懂参数

java - Maven/Java 构建 - SSL 对等端错误关闭

java线程套接字: which thread receives the packet?

groovy - 如何在构建面板后动态添加按钮组到面板

java - 如何在没有用户交互的情况下通过 Java 找到 PostgreSQL 安装文件夹?

Java ProcessBuilder 管道

java - bean 类 [org.springframework.ldap.core.LdapTemplate] 的属性 'defaultCountLimit' 无效