java - Groovy 中的系统调用失败

标签 java shell groovy processbuilder

我正在 Windows 10 上探索 Groovy 以及使用时

"java -version".execute().text

我没有得到任何输出,并且在检查错误输出时使用:

def pb = new ProcessBuilder("java -version").redirectErrorStream(true);
def result = pb.start()
println result.text

事情是这样的:

Caught: java.io.IOException: Cannot run program "java -version": CreateProcess error=2, Den angivne fil blev ikke fundet
java.io.IOException: Cannot run program "java -version": CreateProcess error=2, Den angivne fil blev ikke fundet
at java_lang_ProcessBuilder$start$0.call(Unknown Source)
at test$_run_closure2.doCall(test.groovy:59)
at test.run(test.groovy:51)                                                                                            

看起来Groovy完全忽略了PATH并且只在当前目录中搜索。例如,如果我在同一目录中创建一个批处理文件,Groovy 将运行它。但是,如果我尝试向它传递任何参数,它就会失败。看来 Groovy 将参数解释为文件名的一部分。

感觉 Groovy 要么极其无能,要么我以错误的方式处理这个问题......

我习惯在 Ruby 中执行 system("java -version"),那么在 Groovy 中执行此操作的惯用方法是什么?

最佳答案

"java -version".execute().text

不会给您任何输出,因为此命令将其输出写入标准输出。 (例如 java -version 2>/dev/null 不打印任何内容)

def pb = new ProcessBuilder("java -version").redirectErrorStream(true)

可以工作,但实际上存在错误,您尝试运行程序java -version,该程序不存在。因此,一种方法是:

def pb = new ProcessBuilder("java", "-version").redirectErrorStream(true)

关于java - Groovy 中的系统调用失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45800800/

相关文章:

java - SWT:更好地使用新的 display.shell 方法?

Shell:Sed -i.bak 通过附加当前日期来重命名文件

collections - 如何从常规集合的 collect() 方法中调用具有多个参数的闭包?

java - 为什么Gradle编译.java文件而不创建我的.jar?

java - 将 Java 库添加到 Netbeans Grails 项目

java - 将变量从 java 传递到 javascript

java - 将 ssl 处理从 Tomcat 转移到 Apache?

java - Android:是否可以将 ArrayList<myObject> 放入 bundle 中?

java - 将数据保存在 vector 中并在其他函数中重用

linux - 将部分bash参数组合成一个字符串