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?
java.version
est une propriété système qui existe dans chaque JVM. 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: S'il s'agit d'une
1.x.y_z
chaîne de version, extrayez le caractère à l'index 2 de la chaîne. S'il s'agit d'unex.y.z
chaîne de version, coupez la chaîne à son premier caractère de point, s'il en existe un.Vous pouvez maintenant vérifier la version beaucoup plus confortablement:
la source
double version = 1.6
etDouble.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.Qu'en est-il d'obtenir la version à partir des méta-infos du package:
Imprime quelque chose comme:
1.7.0_13
la source
Runtime.class.getPackage().getSpecificationVersion()
Runtime.class.getPackage().getImplementationVersion()
semble revenirnull
sur JDK9.Runtime.version()
Depuis Java 9, vous pouvez utiliser
Runtime.version()
, qui renvoie unRuntime.Version
:la source
Le moyen le plus simple ( java.specification.version ):
ou quelque chose comme ( java.version ):
ou si vous voulez tout casser ( java.runtime.version ):
la source
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"
.la source
Ne fonctionne pas, besoin
--pos
d'évaluer le double:la source
Exemple pour Apache Commons Lang:
la source
version < 1.4f
... Que se passe-t-il quandversion = 1.4f
?version <= 1.4f
.. Malheureusement,SystemUtils
ne fournit pas deisJavaVersionLessThan
méthode mais alors (heureusement) vous pouvez également mettre le code hérité dans unelse
bloc, ce qui est plus propre.1.4f
revenir au code hérité?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.Voici l'implémentation dans JOSM :
la source
Si vous pouvez avoir une dépendance aux utils apache, vous pouvez utiliser org.apache.commons.lang3.SystemUtils.
la source
Je ne connais pas d'autre moyen de vérifier cela, mais ceci: 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 donc je m'attendrais à ce qu'il travailler avec d’autres JVM.
la source
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
la source