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?
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.
Java.version
propriété système "Java.version
propriété système "Java.version
est un propriété système qui existe dans chaque machine virtuelle Java. Il existe deux formats possibles pour cela:
1.6.0_23
, 1.7.0
, 1.7.0_80
, 1.8.0_211
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) {
// ...
}
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
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];
Depuis Java 9, vous pouvez utiliser Runtime.version()
, qui renvoie un Runtime.Version
:
Runtime.Version version = Runtime.version();
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;
}
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"
.
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 :)
}
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));
}
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));
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.
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