【问题标题】:Executing command in ProcessBuilder does not seem to work for "java" commands in Windows (Kotlin)在 ProcessBuilder 中执行命令似乎不适用于 Windows (Kotlin) 中的“java”命令
【发布时间】:2020-10-06 19:17:39
【问题描述】:

当前正在尝试以编程方式执行 .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 我会得到版本信息。

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

【问题讨论】:

  • 如果你离开/c
  • 你试过直接运行java吗? (我不了解 Windows,但 this question 似乎建议你不需要 cmd.exe 如果你正在运行一个不是内置的命令。)
  • @jmizv 我已经尝试删除/c,但是这个过程最终只是挂起。不知道之后如何结束。 @gidds 我应该把它放在我的描述中,但我确实尝试运行:val pb = ProcessBuilder("java", "-version") 当我运行它时,输出中什么也没有出现
  • 可能与java -version 输出在stderr 中,而不是stdout 中有关
  • 是的,我还会检查 StdErr 中是否有东西。

标签: java windows kotlin processbuilder


【解决方案1】:

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

试试这个代码:

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

你也可以试试Koproc lib

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

您可以使用timeout = 120 秒运行java 进程:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-14
    • 2017-03-07
    • 1970-01-01
    • 2022-01-11
    • 2012-03-11
    • 2012-06-14
    • 2011-04-16
    • 2023-03-11
    相关资源
    最近更新 更多