首页 > 解决方案 > 在 ProcessBuilder 中执行命令似乎不适用于 Windows (Kotlin) 中的“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", "/c", "echo", "hello world")

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

我还能做些什么来让它发挥作用?

标签: javawindowskotlinprocessbuilder

解决方案


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

试试这个代码:

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

你也可以试试Koproc lib

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

您可以使用sec运行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


推荐阅读