ProcessBuilder завершается ошибкой при выполнении команды, включающей локальную переменную среды

Я могу выполнять обычные команды в 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


person codepleb    schedule 22.12.2018    source источник
comment
Я думаю, что BeanShell больше ориентирован на такого типа системных администраторов.   -  person Thufir    schedule 23.12.2018


Ответы (2)


Вы не можете использовать такие команды оболочки bash без bash. Но вы можете программно манипулировать окружением самостоятельно. Нравиться,

final ProcessBuilder processBuilder = new ProcessBuilder("./bedrock_server");
processBuilder.environment().put("LD_LIBRARY_PATH", ".");
processBuilder.directory(MC_PAL_LOCATION_DIR.toFile());
process = processBuilder.start();
person Elliott Frisch    schedule 22.12.2018
comment
Лол, это смущает, так близко, но я не понял. Благодарю вас! - person codepleb; 23.12.2018

Как указал @ElliottFrisch, вы не можете использовать команду оболочки без bash, поэтому вы либо добавляете 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();
person Community    schedule 22.12.2018