実行時のJavaバージョンの取得


128

1.6で修正されたJDK 1.5のJavaバグを回避する必要があります。次の条件を使用しています。

if (System.getProperty("java.version").startsWith("1.5.")) {
    ...
} else {
    ...
}

これは他のJVMでも機能しますか?これをチェックするより良い方法はありますか?

回答:


41

これらの記事は、適切なバージョンの命名規則に従っているため、チェック1.5または1.6プレフィックスが機能することを示唆しているようです。

Sunの技術記事


1
OracleかOpenかを取得する方法はありますか?
Joe C

89

java.versionあるシステムプロパティすべてのJVMに存在しています。可能な形式は2つあります。

  • Javaの8以下:1.6.0_231.7.01.7.0_801.8.0_211
  • Javaの9以上:9.0.111.0.41212.0.1

メジャーバージョンを抽出する方法は次のとおりです。1.x.y_zバージョン文字列の場合は、文字列のインデックス2にある文字を抽出します。x.y.zバージョン文字列の場合、文字列が存在する場合は、最初のドット文字にカットします。

private static int getVersion() {
    String version = System.getProperty("java.version");
    if(version.startsWith("1.")) {
        version = version.substring(2, 3);
    } else {
        int dot = version.indexOf(".");
        if(dot != -1) { version = version.substring(0, dot); }
    } return Integer.parseInt(version);
}

これで、バージョンをより快適に確認できます。

if(getVersion() < 6) {
    // ...
}

7
1.5では問題ありませんが、1.6は浮動小数点数として正確ではありません。
ハ。

1
FPの精度はさておき、OPのニーズのために、提供されるコードは> =ではなく(バージョン> 1.5)である必要があります。OPに:現在の文字列比較を使用する場合、1.5未満もチェックする必要がありますか?
スティーブンマッケンジー

1
@Ha:たぶん、しかし、double version = 1.6Double.parseDouble("1.6")、まだ右、同じビットパターンを生成する必要がありますか?数値の演算は行わないため(単純な比較のみ)、==でも期待どおりに機能します。
アーロンディグラ

1
しかし、まもなくバージョン1.1が再び登場します...または1.10の代わりに、2.0から開始します[:-)
user85421

7
Java 9では、「1」はありません。前に。文字列は「9 ...」で始まります
Dave C

59

パッケージのメタ情報からバージョンを取得するのはどうですか?

String version = Runtime.class.getPackage().getImplementationVersion();

次のようなものを出力します。

1.7.0_13


9
ああ、そういうのが私の心を吹き飛ばした。私の場合には、すべて私が欲しかったけどそうバージョンの最初の2つの部分だった:Runtime.class.getPackage().getSpecificationVersion()
ウェズリーハートフォード

8
Runtime.class.getPackage().getImplementationVersion()nullJDK9 に戻るようです。
tresf 2017

多分これはそれがMANIFEST.MFで定義されている場合にのみ機能しますか?
アーロンディグラ2017


29

最も簡単な方法(java.specification.version):

double version = Double.parseDouble(System.getProperty("java.specification.version"));

if (version == 1.5) {
    // 1.5 specific code
} else {
    // ...
}

または(java.version)のようなもの:

String[] javaVersionElements = System.getProperty("java.version").split("\\.");

int major = Integer.parseInt(javaVersionElements[1]);

if (major == 5) {
    // 1.5 specific code
} else {
    // ...
}

または、すべてを分割したい場合(java.runtime.version):

String discard, major, minor, update, build;

String[] javaVersionElements = System.getProperty("java.runtime.version").split("\\.|_|-b");

discard = javaVersionElements[0];
major   = javaVersionElements[1];
minor   = javaVersionElements[2];
update  = javaVersionElements[3];
build   = javaVersionElements[4];

11

Java 9以降では、命名規則が異なることに注意してください。ではなくをSystem.getProperty("java.version")返します。"9""1.9"


8

動作しません、--pos二重を評価する必要があります:

    String version = System.getProperty("java.version");
    System.out.println("version:" + version);
    int pos = 0, count = 0;
    for (; pos < version.length() && count < 2; pos++) {
        if (version.charAt(pos) == '.') {
            count++;
        }
    }

    --pos; //EVALUATE double

    double dversion = Double.parseDouble(version.substring(0, pos));
    System.out.println("dversion:" + dversion);
    return dversion;
}

7

Apache Commons Langの例:

import org.apache.commons.lang.SystemUtils;

    Float version = SystemUtils.JAVA_VERSION_FLOAT;

    if (version < 1.4f) { 
        // legacy
    } else if (SystemUtils.IS_JAVA_1_5) {
        // 1.5 specific code
    } else if (SystemUtils.isJavaVersionAtLeast(1.6f)) {
        // 1.6 compatible code
    } else {
        // dodgy clause to catch 1.4 :)
    }

1
version < 1.4f...ときに何が起こりversion = 1.4fますか?
ADTC、2014

はい、そうです。1.4fは上記の例ではキャプチャされません。この例は、Javaのプロパティの代替として、Apache Commons Langの定数のみを示しています:)
mvanle

回答を編集してversion <= 1.4f..に変更できます。残念ながらメソッドSystemUtilsは提供されていませんisJavaVersionLessThanが、(幸いなことに)従来のコードをelseブロックに入れることもできます。
ADTC、2014

エラー... 「1.4をキャッチするための危険な句」1.4fレガシーコードにフォールバックしないでください。
ADTC、2014

2
私は提案します:if (SystemUtils.IS_JAVA_1_5) { /* 1.5 specific code */ } else if (SystemUtils.isJavaVersionAtLeast(1.6f)) { /* modern code */ } else { /* fall back to legacy code */ }。上記の特定のコード、以下の一般的なコード、一番下のフォールバックコード。
ADTC、2014

5

JOSMでの実装は次のとおりです。

/**
 * Returns the Java version as an int value.
 * @return the Java version as an int value (8, 9, etc.)
 * @since 12130
 */
public static int getJavaVersion() {
    String version = System.getProperty("java.version");
    if (version.startsWith("1.")) {
        version = version.substring(2);
    }
    // Allow these formats:
    // 1.8.0_72-ea
    // 9-ea
    // 9
    // 9.0.1
    int dotPos = version.indexOf('.');
    int dashPos = version.indexOf('-');
    return Integer.parseInt(version.substring(0,
            dotPos > -1 ? dotPos : dashPos > -1 ? dashPos : 1));
}

4

apache utilsに依存できる場合は、org.apache.commons.lang3.SystemUtilsを使用できます。

    System.out.println("Is Java version at least 1.8: " + SystemUtils.isJavaVersionAtLeast(JavaVersion.JAVA_1_8));


1

Scalaに変換された@mvanleからの回答は次のとおりです。 scala> val Array(javaVerPrefix, javaVerMajor, javaVerMinor, _, _) = System.getProperty("java.runtime.version").split("\\.|_|-b") javaVerPrefix: String = 1 javaVerMajor: String = 8 javaVerMinor: String = 0

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.