ProcessBuilderでJavaコマンドを呼び出す際の注意点
この話の前提として以下の投稿がある。
まず結論から
ここで問題にしているのは、あるJavaプログラム内部でProcessBuilderを使用して、別のJavaプログラムを起動する際のふるまいである。もちろん、コマンドの絶対パスは指定していない。
最初に結論としては、
- 少なくともjava/javawコマンドについては、PATH環境変数は一切見ない。現在実行中のJavaバージョンのものになる。
- 投入するコマンドがjavawであっても、その挙動はjavaコマンドになる。
- つまり、現在実行中のJavaバージョンの「Javaコマンド」が使用されることになる。
※ただし、この挙動がOracle Javaのみのものなのか、Windowsのみのものなのかは現在のところ不明。
検証プログラム
検証するためのプログラムを作成した。
- https://gitlab.com/ysugimura/jarinvocation
ソース - https://ysugimura.github.io/dist/
にビルド済みのものがある(現在:jarInvocation-0.2.jar)
単純に起動すると、現在のJava環境とPATH設定を表示し、javaもしくはjavawボタンを押すと、それぞれのコマンドを使い、自身を再度起動するというものだ。
検証プログラムの挙動
この挙動を見てみると、
- PATH環境変数がどうであろうが、子プロセスは親プロセスと同一のJavaバージョンが使用される。
- 起動コマンドがjavaだろうがjavawだろうが、プログラムが終了するまではプロセスが終了しない。つまりjavaコマンドの振る舞いになる。
ディスカッション
コメント一覧
まだ、コメントがありません