java - 在 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
我会得到版本信息。
我还能做些什么来让它发挥作用?
解决方案
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
推荐阅读
- javascript - react-router-dom 不工作只是渲染“/”
- python - 在python中使用for循环创建多行字符串
- php - 使用 PDO 获取 SQL 结果中记录的位置
- python - 如何使用 numy linalg lstsq 来拟合具有相同斜率但截距不同的两个数据集?
- ag-grid-react - 无法增加 Ag-grid 行高
- shopify - 如何使用三元或除非排除供应商类型?
- xml - 使用 PLSQL 将 XML 解析为数据库表
- python - 用于有效查找大型集合的小交集的数据结构
- javascript - 在 JavaScript 中使用 $ 作为变量名是否有效?
- javascript - Easy-peasy useStoreActions 不会立即更新状态?