【问题标题】:ProcessBuilder fails on command that includes local environment variableProcessBuilder 在包含本地环境变量的命令上失败
【发布时间】:2018-12-22 21:40:03
【问题描述】:

我可以在 Linux 上执行由 processBuilder 封装的常用命令。但是我目前正在尝试像下面的示例一样运行 minecraft 服务器,并在命令之前设置了一些变量,但它失败并出现异常。

final ProcessBuilder processBuilder = new ProcessBuilder("LD_LIBRARY_PATH=. ./bedrock_server");
processBuilder.directory(MC_PAL_LOCATION_DIR.toFile());
process = processBuilder.start();

例外:

java.io.IOException: Cannot run program "LD_LIBRARY_PATH=. ./bedrock_server" (in directory "/home/user/Desktop/minecraft_bedrock_server_t"): error=2, No such file or directory
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
    at controller.Server.startMinecraftServer(Server.java:91)
    at controller.Server.start(Server.java:58)
    at Bootstrapper.bootServer(Bootstrapper.java:67)
    at Bootstrapper.main(Bootstrapper.java:30)
Caused by: java.io.IOException: error=2, No such file or directory
    at java.lang.UNIXProcess.forkAndExec(Native Method)
    at java.lang.UNIXProcess.<init>(UNIXProcess.java:247)
    at java.lang.ProcessImpl.start(ProcessImpl.java:134)
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
    ... 4 more
Exception in thread "Thread-0" java.lang.NullPointerException
    at controller.ConsoleInput.run(ConsoleInput.java:16)
    at java.lang.Thread.run(Thread.java:748)

是否有可能将 processBuilder 用于此类命令?如果我将其直接粘贴到终端,则该命令有效。

服务器链接:https://minecraft.net/en-us/download/server/bedrock/

命令:LD_LIBRARY_PATH=. ./bedrock_server

【问题讨论】:

  • 认为 BeanShell 更适合这种类型的系统管理员。

标签: java process processbuilder


【解决方案1】:

如果没有 bash,您将无法使用类似的 bash shell 命令。但是您可以通过编程方式自己操纵环境。喜欢,

final ProcessBuilder processBuilder = new ProcessBuilder("./bedrock_server");
processBuilder.environment().put("LD_LIBRARY_PATH", ".");
processBuilder.directory(MC_PAL_LOCATION_DIR.toFile());
process = processBuilder.start();

【讨论】:

  • 哈哈,这很尴尬,这么近,但我没弄明白。谢谢!
【解决方案2】:

正如@ElliottFrisch 所指出的,没有 bash 就不能使用 shell 命令,因此您可以将 LD_LIBRARY_PATH 添加到环境映射或执行 bash:

    final ProcessBuilder processBuilder = new ProcessBuilder("bash", "-c",  "LD_LIBRARY_PATH=. ./bedrock_server");
    processBuilder.directory(MC_PAL_LOCATION_DIR.toFile());
    process = processBuilder.start();

【讨论】:

    猜你喜欢
    • 2019-04-12
    • 1970-01-01
    • 2020-06-01
    • 1970-01-01
    • 2019-05-15
    • 2018-11-12
    • 2011-10-06
    • 2015-08-05
    • 2015-08-14
    相关资源
    最近更新 更多