Od Runtime.exec(String) do argumentów ProcessBuilder
Uruchamiaj procesy z jawną listą argumentów i konfiguracją ProcessBuilder.
Porównanie kodu
✕ Command string
Process process = Runtime.getRuntime()
.exec("git show " + revision);
✓ ProcessBuilder
Process process = new ProcessBuilder(
"git", "show", revision)
.redirectErrorStream(true)
.start();
Widzisz problem z tym kodem? Daj nam znać.
Dlaczego nowoczesne podejście wygrywa
Dokładne argumenty
Każdy argument procesu pozostaje odrębną wartością, bez tokenizacji łańcucha polecenia.
Jawna konfiguracja
Środowisko, katalog, przekierowania i obsługa błędów są konfigurowane razem.
Bezpieczniejsze granice
Unika budowania łańcucha polecenia w stylu powłoki z wartości dynamicznych.
Stare podejście
Runtime.exec(String)
Nowoczesne podejście
ProcessBuilder
Od JDK
5
Poziom trudności
Średniozaawansowany
Wsparcie JDK
Od Runtime.exec(String) do argumentów ProcessBuilder
Dostępne
Szeroko dostępne od JDK 5 (wrzesień 2004)
Jak to działa
Runtime.exec(String) stosuje tokenizację łańcucha polecenia w Javie, którą łatwo źle zrozumieć, gdy argumenty zawierają spacje lub cudzysłowy. ProcessBuilder przyjmuje argumenty programu jako odrębne wartości i jawnie udostępnia katalog roboczy, środowisko, przekierowania wejścia/wyjścia oraz politykę strumienia błędów. Nie uruchamia powłoki, o ile aplikacja nie zrobi tego celowo.
Powiązana dokumentacja
Dowód