Ich muss einen Java-Fehler in JDK 1.5 umgehen, der in 1.6 behoben wurde. Ich verwende die folgende Bedingung:
if (System.getProperty("java.version").startsWith("1.5.")) {
...
} else {
...
}
Funktioniert dies für andere JVMs? Gibt es eine bessere Möglichkeit, dies zu überprüfen?
java.version
ist eine Systemeigenschaft , die in jeder JVM vorhanden ist. Es gibt zwei mögliche Formate dafür: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
Hier ist ein Trick, um die Hauptversion zu extrahieren: Wenn es sich um eine
1.x.y_z
Versionszeichenfolge handelt, extrahieren Sie das Zeichen an Index 2 der Zeichenfolge. Wenn es sich um einex.y.z
Versionszeichenfolge handelt, schneiden Sie die Zeichenfolge auf das erste Punktzeichen, falls vorhanden.Jetzt können Sie die Version viel bequemer überprüfen:
quelle
double version = 1.6
undDouble.parseDouble("1.6")
sollte trotzdem das gleiche Bitmuster ergeben, oder? Da wir keine Arithmetik für die Zahl durchführen (nur ein einfacher Vergleich), funktioniert sogar == wie erwartet.Was ist mit dem Abrufen der Version aus den Paket-Meta-Infos:
Druckt etwas aus wie:
1.7.0_13
quelle
Runtime.class.getPackage().getSpecificationVersion()
Runtime.class.getPackage().getImplementationVersion()
scheintnull
auf JDK9 zurückzukehren.Runtime.version()
Seit Java 9 können Sie Folgendes verwenden :
Runtime.version()
aRuntime.Version
:quelle
Der einfachste Weg ( java.specification.version ):
oder so ähnlich wie ( java.version ):
oder wenn Sie alles aufteilen möchten ( java.runtime.version ):
quelle
Nur ein Hinweis, dass in Java 9 und höher die Namenskonvention anders ist.
System.getProperty("java.version")
kehrt"9"
eher zurück als"1.9"
.quelle
Funktioniert nicht, muss
--pos
doppelt bewertet werden:quelle
Beispiel für Apache Commons Lang:
quelle
version < 1.4f
... was passiert wannversion = 1.4f
?version <= 1.4f
. LeiderSystemUtils
gibt es keineisJavaVersionLessThan
Methode, aber dann können Sie (zum Glück) auch den Legacy-Code in einenelse
saubereren Block einfügen .1.4f
auf alten Code zurückgreifen?if (SystemUtils.IS_JAVA_1_5) { /* 1.5 specific code */ } else if (SystemUtils.isJavaVersionAtLeast(1.6f)) { /* modern code */ } else { /* fall back to legacy code */ }
. Spezifischer Code oben, generischer Code unten, Fallback-Code ganz unten.Hier ist die Implementierung in JOSM :
quelle
Ich kenne keine andere Möglichkeit, dies zu überprüfen, aber dies: http://java.sun.com/j2se/1.5.0/docs/api/java/lang/System.html#getProperties () "impliziert, dass" java.version "eine Standard-Systemeigenschaft ist, daher würde ich dies erwarten mit anderen JVMs arbeiten.
quelle
Wenn Sie von Apache-Utils abhängig sein können, können Sie org.apache.commons.lang3.SystemUtils verwenden.
quelle
Hier ist die Antwort von @mvanle, konvertiert zu Scala:
scala> val Array(javaVerPrefix, javaVerMajor, javaVerMinor, _, _) = System.getProperty("java.runtime.version").split("\\.|_|-b") javaVerPrefix: String = 1 javaVerMajor: String = 8 javaVerMinor: String = 0
quelle