ProcessBuilder 在包含本地环境变量的命令上失败
ProcessBuilder fails on command that includes local environment variable
我可以在 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 用于此类命令?如果我将它直接粘贴到终端,该命令将起作用。
Link 到服务器:https://minecraft.net/en-us/download/server/bedrock/
命令:LD_LIBRARY_PATH=. ./bedrock_server
如果没有 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();
正如@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();
我可以在 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 用于此类命令?如果我将它直接粘贴到终端,该命令将起作用。
Link 到服务器:https://minecraft.net/en-us/download/server/bedrock/
命令:LD_LIBRARY_PATH=. ./bedrock_server
如果没有 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();
正如@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();