Tooling 中級

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
難易度
中級
Runtime.exec(String) から ProcessBuilder の引数へ
利用可能

JDK 5(2004年9月)以降、広く利用可能

Runtime.exec(String) は Java のコマンド文字列のトークン分割を適用するため、引数に空白や引用符が含まれると誤解しやすくなります。ProcessBuilder はプログラムの引数を個別の値として受け取り、作業ディレクトリ、環境変数、入出力のリダイレクト、エラーストリームの扱いを明示的に公開します。アプリケーションが意図的に起動しない限り、シェルは呼び出されません。