Java:どこのJavaであるかをJavaプログラム中で検出する

本家Oracleのものに加え、OpenJDKやそれに基づくAdoptOpenJDK他が出てきたため、起動したJavaプログラムが、実際にどのJavaの元で動作しているのか知りたい場合がある。例えば、複数のJavaをインストールしている場合、Windowsの場合、レジストリの設定やPATHの設定によってどれが選択されるのか異なってしまうからだ。

これは当然System.getProperty()で取得することができるのだが、実際にどのプロパティを見れば「どのJavaであるのか」明確にわかるのだろうか?

プロパティの値例

System.getProperty()で考えられるすべてのプロパティを取得した例が以下にある。

JDKによる違い

これらを見てみると以下のような違いがある。

java.runtime.name java.vm.name java.vendor java.vm.vendor
Oracle Java(TM)… Java HostSpot(TM)… Oracle… “Oracle…
OpenJDK OpenJDK Runtime… OpenJDK 64-Bit… Oracle… “Oracle…
AdoptOpenJDK OpenJDK Runtime… OpenJDK 64-Bit… AdoptOpenJDK AdoptOpenJDK

Oracle/OpenJDKの違いとしては、java.runtime.name, java.vm.nameしか無いのだが、しかしこの部分はOpenJDK/AdoptOpenJDKで同じ値になっている。OpenJDK/AdoptOpenJDKの違いとしては、主にはjava.vender, java.vm.venderの部分だ。

面倒なことにただ一つのプロパティで区別することはできないようだ。これら複数のプロパティを見てみないとわからない。

では、java.runtime.nameかjava.vm.nameのいずれか、java.vendorかjava.vm.vendorのいずれかにしたいのだが、どちらを選択すべきだろうか?

ttps://docs.oracle.com/javase/jp/8/docs/api/java/lang/System.htmlを見てみる。

  • java.runtime.name:説明が無い
  • java.vm.name:Java仮想マシンの実装名
  • java.vendor:Java Runtime Environmentのベンダー
  • java.vm.vendor:Java仮想マシンの実装のベンダー

正直なところ、この説明では実際に何が入っているべきなのかはわからない。

※結論は無い。調査を継続する