Runtime.exec(String) から ProcessBuilder の引数へ
明示的な引数リストと 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
難易度
中級
JDKサポート
Runtime.exec(String) から ProcessBuilder の引数へ
利用可能
JDK 5(2004年9月)以降、広く利用可能
仕組み
Runtime.exec(String) は Java のコマンド文字列のトークン分割を適用するため、引数に空白や引用符が含まれると誤解しやすくなります。ProcessBuilder はプログラムの引数を個別の値として受け取り、作業ディレクトリ、環境変数、入出力のリダイレクト、エラーストリームの扱いを明示的に公開します。アプリケーションが意図的に起動しない限り、シェルは呼び出されません。
関連ドキュメント
証明