От Runtime.exec(String) к аргументам ProcessBuilder
Запускайте процессы с явным списком аргументов и настройкой ProcessBuilder.
Process process = Runtime.getRuntime()
.exec("git show " + revision);
Process process = new ProcessBuilder(
"git", "show", revision)
.redirectErrorStream(true)
.start();
Точные аргументы
Каждый аргумент процесса остаётся отдельным значением без разбиения командной строки.
Явная настройка
Окружение, каталог, перенаправления и обработка ошибок настраиваются вместе.
Безопасные границы
Исключает сборку строки команды в стиле оболочки из динамических значений.
Широко доступно начиная с JDK 5 (сентябрь 2004)
Runtime.exec(String) применяет разбиение командной строки Java на токены, которое легко понять неправильно, когда аргументы содержат пробелы или кавычки. ProcessBuilder принимает аргументы программы как отдельные значения и явно предоставляет рабочий каталог, окружение, перенаправления ввода-вывода и политику потока ошибок. Он не вызывает оболочку, если приложение не запускает её намеренно.