Obtenir la version Java au moment de l'exécution


128

Je dois contourner un bogue Java dans JDK 1.5 qui a été corrigé dans 1.6. J'utilise la condition suivante:

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

Cela fonctionnera-t-il pour d'autres JVM? Y a-t-il une meilleure façon de vérifier cela?

Réponses:


41

Ces articles semblent suggérer que la vérification du préfixe 1.5ou du 1.6préfixe devrait fonctionner, car elle suit la convention de dénomination de version appropriée.

Articles techniques Sun


1
Existe-t-il un moyen d'obtenir que ce soit Oracle ou Open?
— Joe C

89

java.versionest une propriété système qui existe dans chaque JVM. Il existe deux formats possibles pour cela:

  • Java 8 ou moins: 1.6.0_23, 1.7.0, 1.7.0_80,1.8.0_211
  • Java 9 ou supérieur: 9.0.1, 11.0.4, 12,12.0.1

Voici une astuce pour extraire la version majeure: S'il s'agit d'une 1.x.y_zchaîne de version, extrayez le caractère à l'index 2 de la chaîne. S'il s'agit d'une x.y.zchaîne de version, coupez la chaîne à son premier caractère de point, s'il en existe un.

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

Vous pouvez maintenant vérifier la version beaucoup plus confortablement:

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

7
C'est correct pour 1,5 mais 1,6 n'est pas précis en tant que nombre à virgule flottante.
— Ha.

1
Mis à part la précision FP, pour les besoins de l'OP, le code fourni doit au moins être (version> 1.5), et non> =. Pour l'OP: si vous utilisez votre comparaison de chaînes actuelle, devez-vous également vérifier en dessous de 1,5?
— Steven Mackenzie

1
@Ha: Peut-être mais double version = 1.6et Double.parseDouble("1.6")devrait toujours produire le même motif de bits, non? Puisque nous ne faisons pas d'arithmétique sur le nombre (seulement une simple comparaison), même == fonctionnera comme prévu.
— Aaron Digulla

1
mais bientôt nous aurons à nouveau la version 1.1 ... ou peut-être qu'au lieu de 1.10 nous commençons avec 2.0 [:-)
— user85421

7
Dans Java 9, il n'y aura pas de "1". devant. La chaîne commencera par "9 ..."
— Dave C

59

Qu'en est-il d'obtenir la version à partir des méta-infos du package:

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

Imprime quelque chose comme:

1.7.0_13


9
Wow, ça m'a époustouflé. Bien que dans mon cas, tout ce que je voulais, c'était les deux premières parties de la version donc:Runtime.class.getPackage().getSpecificationVersion()
— Wesley Hartford

8
Runtime.class.getPackage().getImplementationVersion()semble revenir nullsur JDK9.
— tresf le

Peut-être que cela ne fonctionne que lorsqu'il est défini dans MANIFEST.MF?
— Aaron Digulla


29

Le moyen le plus simple ( java.specification.version ):

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

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

ou quelque chose comme ( java.version ):

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

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

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

ou si vous voulez tout casser ( 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

Juste une note que dans Java 9 et plus, la convention de dénomination est différente. System.getProperty("java.version")renvoie "9"plutôt que "1.9".


8

Ne fonctionne pas, besoin --posd'évaluer le double:

    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

Exemple pour 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... Que se passe-t-il quand version = 1.4f?
— ADTC

Ah oui, vous avez raison - 1.4f ne serait pas capturé dans l'exemple ci-dessus. L'exemple ne montre que les constantes d'Apache Commons Lang comme alternative aux propriétés de Java :)
— mvanle

Vous pouvez modifier la réponse et la changer en version <= 1.4f.. Malheureusement, SystemUtilsne fournit pas de isJavaVersionLessThanméthode mais alors (heureusement) vous pouvez également mettre le code hérité dans un elsebloc, ce qui est plus propre.
— ADTC

Err ... "clause douteuse pour attraper 1.4" ? Ne devrait pas 1.4frevenir au code hérité?
— ADTC

2
Je suggère: if (SystemUtils.IS_JAVA_1_5) { /* 1.5 specific code */ } else if (SystemUtils.isJavaVersionAtLeast(1.6f)) { /* modern code */ } else { /* fall back to legacy code */ }. Code spécifique ci-dessus, code générique ci-dessous, code de secours tout en bas.
— ADTC

5

Voici l'implémentation dans 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

Si vous pouvez avoir une dépendance aux utils apache, vous pouvez utiliser org.apache.commons.lang3.SystemUtils.

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


1

Voici la réponse de @mvanle, converti en Scala: scala> val Array(javaVerPrefix, javaVerMajor, javaVerMinor, _, _) = System.getProperty("java.runtime.version").split("\\.|_|-b") javaVerPrefix: String = 1 javaVerMajor: String = 8 javaVerMinor: String = 0

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.