Отримання версії Java під час виконання


128

Мені потрібно обійти помилку Java в JDK 1.5, яка була виправлена ​​в 1.6. Я використовую таку умову:

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

Чи буде це спрацьовувати для інших СП? Чи є кращий спосіб перевірити це?

Відповіді:


41

Ці статті, начебто, говорять про те, що перевірка на 1.5або 1.6префікса повинна працювати, оскільки це відповідає правильній конвенції про іменування версій.

НД Технічні статті


1
Чи є спосіб отримати, Oracle чи Open?
Джо C

89

java.version- це системна властивість, яка існує у кожному JVM. Для цього є два можливі формати:

  • Java 8 або зменшити: 1.6.0_23,1.7.0 , 1.7.0_80,1.8.0_211
  • Java 9 або вище: 9.0.1, 11.0.4,12 ,12.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 убік, для потреб ОП надається принаймні код (версія> 1.5), а не> =. До ОП: якщо ви використовуєте поточне порівняння рядків, вам також потрібно перевірити нижче 1,5?
Стівен Макензі

1
@Ha: Може бути , але double version = 1.6і Double.parseDouble("1.6")все одно повинні дати той же бітовий шаблон, вірно? Оскільки ми не займаємося арифметикою числа (лише просте порівняння), навіть == буде працювати, як очікувалося.
Аарон Дігулла

1
але незабаром у нас знову з’явиться версія 1.1 ... а може, замість 1.10 ми почнемо з 2.0 [:-)
user85421

7
У Java 9 не буде "1." попереду. Рядок розпочнеться з "9 ..."
Дейв C

59

Як щодо отримання версії з мета-інформації пакета:

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

Виводить щось на зразок:

1.7.0_13


9
Ух, такий вид підірвав мій розум. Хоча в моєму випадку все, що я хотів, - це перші дві частини версії, тому:Runtime.class.getPackage().getSpecificationVersion()
Веслі Хартфорд

8
Runtime.class.getPackage().getImplementationVersion()здається, повертається nullна JDK9.
tresf

Можливо, це працює лише тоді, коли це визначено в MANIFEST.MF?
Аарон Дігулла


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

Ага так, ви маєте рацію - 1.4f не буде відображено у наведеному вище прикладі. Приклад лише демонструє константи Apache Commons Lang як альтернативу властивостям Java :)
mvanle

Ви можете відредагувати відповідь та змінити її на version <= 1.4f. На жаль, SystemUtilsце не забезпечує isJavaVersionLessThanметод, але тоді (на щастя) ви також можете поставити застарілий код у elseблок, який є більш чистим.
ADTC

Помилка ... "хитромудрий пункт про зловлення 1,4" ? Ви не повинні 1.4fповернутися до застарілого коду?
ADTC

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

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, ви можете використовувати org.apache.commons.lang3.SystemUtils.

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


1

Ось відповідь від @mvanle, перетвореної на Scala: scala> val Array(javaVerPrefix, javaVerMajor, javaVerMinor, _, _) = System.getProperty("java.runtime.version").split("\\.|_|-b") javaVerPrefix: String = 1 javaVerMajor: String = 8 javaVerMinor: String = 0

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.