ProcessBuilderでJavaコマンドを呼び出す際の注意点



この話の前提として以下の投稿がある。

まず結論から

ここで問題にしているのは、あるJavaプログラム内部でProcessBuilderを使用して、別のJavaプログラムを起動する際のふるまいである。もちろん、コマンドの絶対パスは指定していない。

最初に結論としては、

  • 少なくともjava/javawコマンドについては、PATH環境変数は一切見ない。現在実行中のJavaバージョンのものになる。
  • 投入するコマンドがjavawであっても、その挙動はjavaコマンドになる。
  • つまり、現在実行中のJavaバージョンの「Javaコマンド」が使用されることになる。

※ただし、この挙動がOracle Javaのみのものなのか、Windowsのみのものなのかは現在のところ不明。

検証プログラム

検証するためのプログラムを作成した。

単純に起動すると、現在のJava環境とPATH設定を表示し、javaもしくはjavawボタンを押すと、それぞれのコマンドを使い、自身を再度起動するというものだ。

検証プログラムの挙動

この挙動を見てみると、

  • PATH環境変数がどうであろうが、子プロセスは親プロセスと同一のJavaバージョンが使用される。
  • 起動コマンドがjavaだろうがjavawだろうが、プログラムが終了するまではプロセスが終了しない。つまりjavaコマンドの振る舞いになる。