Çalışma zamanında Java sürümünü alma


128

1.6'da düzeltilen JDK 1.5'teki bir Java hatasını çözmem gerekiyor. Aşağıdaki koşulu kullanıyorum:

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

Bu diğer JVM'ler için çalışacak mı? Bunu kontrol etmenin daha iyi bir yolu var mı?

Yanıtlar:


41

Bu makaleler , uygun sürüm adlandırma kuralını izlediğinden, denetleme 1.5veya 1.6ön ekin çalışması gerektiğini öneriyor gibi görünüyor .

Sun Teknik Makaleleri


1
Oracle veya Open olup olmadığını öğrenmenin bir yolu var mı?
Joe C

89

java.versionher JVM'de bulunan bir sistem özelliğidir . Bunun için iki olası format vardır:

  • Java 8 veya daha düşük: 1.6.0_23, 1.7.0, 1.7.0_80,1.8.0_211
  • Java 9 veya üzeri: 9.0.1, 11.0.4, 12,12.0.1

İşte ana sürümü çıkarmak için bir numara: Eğer bu bir 1.x.y_zsürüm dizesiyse, dizenin 2. dizinindeki karakteri çıkarın. Bir x.y.zsürüm dizesiyse, dizeyi varsa ilk nokta karakterine kesin.

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);
}

Artık sürümü çok daha rahat bir şekilde kontrol edebilirsiniz:

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

7
1.5 için uygundur, ancak 1.6 bir kayan nokta sayısı olarak kesin değildir.
Ha.

1
FP hassasiyeti bir yana, OP'nin ihtiyaçları için sağlanan kod> = değil, en azından (sürüm> 1.5) olmalıdır. OP için: mevcut String karşılaştırmanızı kullanırsanız, 1.5'in altına da bakmanız gerekir mi?
Steven Mackenzie

1
@Ha: Belki ama double version = 1.6ve Double.parseDouble("1.6")hala sağ, aynı bit deseni vermelidir? Sayı üzerinde aritmetik yapmadığımız için (yalnızca basit bir karşılaştırma), == bile beklendiği gibi çalışacaktır.
Aaron Digulla

1
ancak yakında 1.1 sürümüne sahip olacağız ... veya belki 1.10 yerine 2.0 ile başlayacağız [:-)
user85421

7
Java 9'da "1" olmayacaktır. önünde.
Dave C

59

Sürümü paket meta bilgilerinden almaya ne dersiniz:

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

Şunun gibi bir şey yazdırır:

1.7.0_13


9
Vay be, bu tür aklımı başımdan aldı Yine de benim durumumda, tek istediğim sürümün ilk iki parçasıydı, bu yüzden:Runtime.class.getPackage().getSpecificationVersion()
Wesley Hartford

8
Runtime.class.getPackage().getImplementationVersion()nullJDK9'da geri dönecek gibi görünüyor .
tresf

Belki bu yalnızca MANIFEST.MF'de tanımlandığında işe yarar?
Aaron Digulla


29

En basit yol ( java.specification.version ):

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

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

veya ( java.version ) gibi bir şey :

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

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

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

veya hepsini bölmek istiyorsanız ( 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 ve üzeri sürümlerde adlandırma kuralının farklı olduğunu unutmayın. yerine System.getProperty("java.version")döner ."9""1.9"


8

Çalışmıyor, --posçift ​​değerlendirmesi gerekiyor :

    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 için örnek:

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... Ne zaman ne olur version = 1.4f?
ADTC

Ah evet, haklısınız - 1.4f yukarıdaki örnekte yakalanmaz. Örnek sadece Apache Commons Lang sabitlerini Java'nın özelliklerine bir alternatif olarak gösteriyor :)
mvanle

Cevabı düzenleyebilir ve olarak değiştirebilirsiniz version <= 1.4f.. Maalesef SystemUtilsbir isJavaVersionLessThanyöntem sağlamaz, ancak daha sonra (neyse ki) eski kodu elsedaha temiz olan bir bloğa da koyabilirsiniz .
ADTC

Err ... "1.4'ü yakalamak için tehlikeli madde" ? Olmamalı 1.4feski kod geri düşmek?
ADTC

2
Öneririm: if (SystemUtils.IS_JAVA_1_5) { /* 1.5 specific code */ } else if (SystemUtils.isJavaVersionAtLeast(1.6f)) { /* modern code */ } else { /* fall back to legacy code */ }. Yukarıdaki özel kod, aşağıda genel kod, en altta yedek kod.
ADTC

5

JOSM'deki uygulama şu şekildedir :

/**
 * 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 yardımcı programlarına bağımlılığınız varsa, org.apache.commons.lang3.SystemUtils'i kullanabilirsiniz.

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


1

İşte Scala'ya dönüştürülmüş @mvanle'nin cevabı: scala> val Array(javaVerPrefix, javaVerMajor, javaVerMinor, _, _) = System.getProperty("java.runtime.version").split("\\.|_|-b") javaVerPrefix: String = 1 javaVerMajor: String = 8 javaVerMinor: String = 0

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.