Necesito evitar un error de Java en JDK 1.5 que se corrigió en 1.6. Estoy usando la siguiente condición:
if (System.getProperty("java.version").startsWith("1.5.")) {
...
} else {
...
}
¿Funcionará para otras JVM? ¿Hay una mejor manera de verificar esto?
java.version
es una propiedad del sistema que existe en cada JVM. Hay dos formatos posibles para ello: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
Aquí hay un truco para extraer la versión principal: si es una
1.x.y_z
cadena de versión, extraiga el carácter en el índice 2 de la cadena. Si es unax.y.z
cadena de versión, corte la cadena a su primer carácter de punto, si existe.Ahora puedes comprobar la versión mucho más cómodamente:
fuente
double version = 1.6
, yDouble.parseDouble("1.6")
aún deben producir el mismo patrón de bits, ¿verdad? Como no hacemos aritmética en el número (solo una comparación simple), incluso == funcionará como se esperaba.¿Qué hay de obtener la versión del paquete de metainformaciones:
Imprime algo como:
1.7.0_13
fuente
Runtime.class.getPackage().getSpecificationVersion()
Runtime.class.getPackage().getImplementationVersion()
parece regresarnull
en JDK9.Runtime.version()
Desde Java 9, puede usar
Runtime.version()
, que devuelve unRuntime.Version
:fuente
La forma más simple ( java.specification.version ):
o algo así como ( java.version ):
o si quieres dividirlo todo ( java.runtime.version ):
fuente
Solo una nota de que en Java 9 y superior, la convención de nomenclatura es diferente.
System.getProperty("java.version")
devuelve en"9"
lugar de"1.9"
.fuente
No funciona, necesita
--pos
evaluar doble:fuente
Ejemplo para Apache Commons Lang:
fuente
version < 1.4f
... ¿Qué pasa cuandoversion = 1.4f
?version <= 1.4f
... DesafortunadamenteSystemUtils
no proporciona unisJavaVersionLessThan
método, pero luego (afortunadamente) también podría poner el código heredado en unelse
bloque, que es más limpio.1.4f
recurrir al código heredado?if (SystemUtils.IS_JAVA_1_5) { /* 1.5 specific code */ } else if (SystemUtils.isJavaVersionAtLeast(1.6f)) { /* modern code */ } else { /* fall back to legacy code */ }
. Código específico arriba, código genérico abajo, código alternativo en la parte inferior.Aquí está la implementación en JOSM :
fuente
Si puede depender de las utilidades de apache, puede usar org.apache.commons.lang3.SystemUtils.
fuente
No conozco otra forma de verificar esto, pero esto: http://java.sun.com/j2se/1.5.0/docs/api/java/lang/System.html#getProperties () "implica que" java.version "es una propiedad estándar del sistema, así que esperaría que trabajar con otras JVM.
fuente
Aquí está la respuesta de @mvanle, convertida a Scala:
scala> val Array(javaVerPrefix, javaVerMajor, javaVerMinor, _, _) = System.getProperty("java.runtime.version").split("\\.|_|-b") javaVerPrefix: String = 1 javaVerMajor: String = 8 javaVerMinor: String = 0
fuente