web-dev-qa-db-fra.com

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

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

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

Est-ce que cela fonctionnera pour d'autres machines virtuelles? Y a-t-il une meilleure façon de vérifier cela?

110
list

Ces articles semblent suggérer que la vérification de 1.5 ou 1.6 Le préfixe devrait fonctionner, car il suit la convention de nommage de version appropriée.

Articles techniques Sun

39

Java.version est un propriété système qui existe dans chaque machine virtuelle Java. Il existe deux formats possibles pour cela:

  • Java 8 ou inférieur: 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: Si c'est un 1.x.y_z version chaîne, extrayez le caractère à l’index 2 de la chaîne. Si c'est un x.y.z version chaîne, coupe la chaîne en son premier 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);
}

Maintenant, vous pouvez vérifier la version beaucoup plus confortablement:

if(getVersion() < 6) {
    // ...
}
66
Aaron Digulla

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

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

Imprime quelque chose comme:

1.7.0_13

51
Stefan

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];
27
mvanle

Depuis Java 9, vous pouvez utiliser Runtime.version() , qui renvoie un Runtime.Version :

Runtime.Version version = Runtime.version();
21
Eng.Fouad

Ne fonctionne pas, besoin de --pos à évaluer 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;
}
9
Alessandro

Il suffit de noter que dans Java 9 et supérieur, la convention de dénomination est différente. System.getProperty("Java.version") renvoie "9" plutôt que "1.9".

8
Sina Madani

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 :)
    }
7
mvanle

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

Si vous pouvez avoir une dépendance aux utilitaires 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));
3
P.Kurek

Je ne connais pas un autre moyen de vérifier cela, mais comme suit: http://Java.Sun.com/j2se/1.5.0/docs/api/Java/lang/System. html # getProperties () "implique que" Java.version "est une propriété système standard. Nous nous attendons donc à ce que cela fonctionne avec d'autres machines virtuelles.

2
Tom Jefferys

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

1
Mike Slinn