Javaのバージョンの取得あれこれ



Javaのバージョン関連のシステムプロパティ

Javaのバージョン関連のシステムプロパティには以下のようなものがあります。

// JREのバージョン
System.out.println(System.getProperty("java.version"));

// JREの仕様バージョン
System.out.println(System.getProperty("java.specification.version"));
		
// JVMの実装バージョン
System.out.println(System.getProperty("java.vm.version"));
		
// Javaクラスの形式のバージョン番号
System.out.println(System.getProperty("java.class.version"));


上記コードの実行結果は、JDK1.6環境で以下のような出力となります。

1.6.0_12
1.6
11.2-b01
50.0

Java9 以降については以下を参照してください。

blog1.mammb.com

ランタイムのバージョン判定

ランタイムのバージョンをプログラム中で判定するには、例えば1.4以上の判定は以下のようになります。

private static final boolean JRE14 = 
        (Double.parseDouble(System.getProperty("java.specification.version")) >= 1.4);
    ・・・
    if (JRE14) {
        ・・・
    }



Javaクラスのバージョン判定

Javaクラスの形式のバージョン番号は以下の通り

private static final double CLASS_VERSION_4 = 48.0;
private static final double CLASS_VERSION_5 = 49.0;
private static final double CLASS_VERSION_6 = 50.0;
private static final double CLASS_VERSION_7 = 51.0;

なので、クラスのバージョンの判定は以下のようになります。

private static final boolean JDK6 =
        (Double.parseDouble(System.getProperty("java.class.version")) >= CLASS_VERSION_6);
    ・・・
    if (JRE14) {
        ・・・
    }




JDKソースバージョン

1.6から追加された javax.lang.model.SourceVersion というenumで判断できます。

//実行環境で完全にサポートされている最新のソースバージョン
System.out.println(SourceVersion.latestSupported().name());

JDK6 の場合以下のように表示されます。

RELEASE_6

対応は以下
RELEASE_0:オリジナルのバージョン
RELEASE_1:Java Platform 1.1
RELEASE_2:Java 2 Platform, Standard Edition v 1.2
RELEASE_3:Java 2 Platform, Standard Edition v 1.3
RELEASE_4:Java 2 Platform, Standard Edition v 1.4
RELEASE_5:Java 2 Platform, Standard Edition 5.0
RELEASE_6:Java Platform, Standard Edition 6


上と同じような書き方にするなら以下のようになります。

private static final boolean JSE6
    = (SourceVersion.latestSupported().ordinal() >= 6);
    ・・・
    if (JRE14) {
        ・・・
    }

enum の ordinal() を条件判定で使っちゃうのは望ましくはないですが、並び順が変更されることは無いハズなので問題ないでしょう。
javax パッケージなので使わない方が吉です。