简体   繁体   English

ProcessBuilder在包含本地环境变量的命令上失败

[英]ProcessBuilder fails on command that includes local environment variable

I can execute usual commands on Linux, wrapped by the processBuilder. 我可以在Linux上执行通常的命令,由processBuilder包装。 But I'm currently trying to run the minecraft server like in the following example, with some variable set before the command, and it fails with an exception. 但是我正在尝试运行Minecraft服务器,如下例所示,在命令之前设置了一些变量,并且它失败并出现异常。

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

Exception: 例外:

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)

Is there any possibility to use the processBuilder for such commands? 是否有可能将processBuilder用于此类命令? The command works if I paste it directly to the terminal. 如果我将它直接粘贴到终端,该命令有效。

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

Command: LD_LIBRARY_PATH=. ./bedrock_server 命令: LD_LIBRARY_PATH=. ./bedrock_server LD_LIBRARY_PATH=. ./bedrock_server

You can't use bash shell commands like that without bash. 如果没有bash,你不能使用这样的bash shell命令。 But you can manipulate the environment yourself programmatically. 但您可以通过编程方式自行操作环境。 Like, 喜欢,

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

As @ElliottFrisch pointed out, you cannot use shell command without bash, therefore you either add LD_LIBRARY_PATH to environment map or execute bash: 正如@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();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM