Respuestas:
Estos artículos parecen sugerir que la comprobación 1.5
o el 1.6
prefijo deberían funcionar, ya que sigue la convención de nomenclatura de la versión adecuada.
java.version
propiedad del sistema"java.version
propiedad del sistema"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 una x.y.z
cadena 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 null
en 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 --pos
evaluar 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 SystemUtils
no proporciona un isJavaVersionLessThan
método, pero luego (afortunadamente) también podría poner el código heredado en un else
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 :
/**
* 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