问题描述
当前正在尝试以编程方式执行.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