Tooling Средний

Запускайте процессы с явным списком аргументов и настройкой ProcessBuilder.

✕ Command string
Process process = Runtime.getRuntime()
        .exec("git show " + revision);
✓ ProcessBuilder
Process process = new ProcessBuilder(
        "git", "show", revision)
        .redirectErrorStream(true)
        .start();
Заметили проблему в этом коде? Сообщите нам.
🎯

Точные аргументы

Каждый аргумент процесса остаётся отдельным значением без разбиения командной строки.

🎛

Явная настройка

Окружение, каталог, перенаправления и обработка ошибок настраиваются вместе.

🛡

Безопасные границы

Исключает сборку строки команды в стиле оболочки из динамических значений.

Старый подход
Runtime.exec(String)
Современный подход
ProcessBuilder
Начиная с JDK
5
Сложность
Средний
От Runtime.exec(String) к аргументам ProcessBuilder
Доступно

Широко доступно начиная с JDK 5 (сентябрь 2004)

Runtime.exec(String) применяет разбиение командной строки Java на токены, которое легко понять неправильно, когда аргументы содержат пробелы или кавычки. ProcessBuilder принимает аргументы программы как отдельные значения и явно предоставляет рабочий каталог, окружение, перенаправления ввода-вывода и политику потока ошибок. Он не вызывает оболочку, если приложение не запускает её намеренно.