在WindowsKotlin中,ProcessBuilder中的执行命令似乎不适用于Windows中的“ java”命令

问题描述

当前正在尝试以编程方式执行.jar文件。但是要测试Java,我尝试运行以下命令:

val p = ProcessBuilder("cmd.exe","/c","java","-version").start()
val results: List<String> = p.inputStream.bufferedReader().readLines()
assertthat("Results should contain java version: ",results,hasItem(containsstring("java version")))

但是,似乎什么也没输出

我能够成功运行:

val pb = ProcessBuilder("cmd.exe","echo","hello world")

我尝试添加Java可执行文件所在的工作目录,但是没有任何反应。 我没有关于如何使这项工作的想法。如果我运行cmd并键入java -version,则会得到版本信息。

我还能做些什么来使它工作?

解决方法

ProcessBuilder将命令java -version的结果写入错误输出Process.errorStream,而不是Process.inputStream

尝试以下代码:

val results: List<String> = p.errorStream.bufferedReader().readLines()

您还可以尝试 Koproc lib

这是一个小的Kotlin库,用于运行基于Java ProcessBuilder的进程和执行命令

您可以在java秒内运行timeout = 120进程:

val koproc = "java -jar some.jar".startProcess { timeoutSec = 120 }

koproc.use {
    println("Out: ${it.readAvailableOut}")
    println("Err: ${it.readAvailableErrOut}")
}

println("Full result after closing: ${koproc.result}")

运行cmd命令:

// 'cmd.exe' process will be closed after timeout
val commandResult = "cmd.exe dirs".startCommand { timeoutSec = 1 }

// But you will get the output
println("Out: ${commandResult.out}")

请参阅单元测试中的示例:https://github.com/kochetkov-ma/koproc/blob/main/src/test/kotlin/ru/iopump/koproc/ExtensionKtIT.kt

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...