Respuestas:
Estos artículos parecen sugerir que la comprobación 1.5o el 1.6prefijo deberían funcionar, ya que sigue la convención de nomenclatura de la versión adecuada.
java.versionpropiedad del sistema"java.versionpropiedad del sistema"java.versiones 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_2119.0.1, 11.0.4, 12,12.0.1Aquí hay un truco para extraer la versión principal: si es una 1.x.y_zcadena de versión, extraiga el carácter en el índice 2 de la cadena. Si es una x.y.zcadena de versión, corte la cadena a su primer carácter de punto, si existe.
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);
}
Ahora puedes comprobar la versión mucho más cómodamente:
if(getVersion() < 6) {
// ...
}
double version = 1.6, y Double.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:
String version = Runtime.class.getPackage().getImplementationVersion();
Imprime algo como:
1.7.0_13
Runtime.class.getPackage().getSpecificationVersion()
Runtime.class.getPackage().getImplementationVersion()parece regresar nullen JDK9.
Runtime.version()Desde Java 9, puede usar Runtime.version(), que devuelve un Runtime.Version:
Runtime.Version version = Runtime.version();
La forma más simple ( java.specification.version ):
double version = Double.parseDouble(System.getProperty("java.specification.version"));
if (version == 1.5) {
// 1.5 specific code
} else {
// ...
}
o algo así como ( java.version ):
String[] javaVersionElements = System.getProperty("java.version").split("\\.");
int major = Integer.parseInt(javaVersionElements[1]);
if (major == 5) {
// 1.5 specific code
} else {
// ...
}
o si quieres dividirlo todo ( 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];
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".
No funciona, necesita --posevaluar doble:
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;
}
Ejemplo para 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 :)
}
version < 1.4f... ¿Qué pasa cuando version = 1.4f?
version <= 1.4f... Desafortunadamente SystemUtilsno proporciona un isJavaVersionLessThanmétodo, pero luego (afortunadamente) también podría poner el código heredado en un elsebloque, que es más limpio.
1.4frecurrir 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 :
/**
* 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));
}
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.
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