Obtener la versión de Java en tiempo de ejecución

Necesito solucionar un error de Java en JDK 1.5 que se solucionó en 1.6. Estoy usando la siguiente condición:

if (System.getProperty("java.version").startsWith("1.5.")) { ... } else { ... } 

¿Funcionará esto para otras JVM? ¿Hay una mejor manera de verificar esto?

Estos artículos parecen sugerir que la comprobación del prefijo 1.5 o 1.6 debería funcionar, ya que sigue la convención de nomenclatura de la versión adecuada.

Artículos técnicos de Sun

  • J2SE SDK / JRE Version String Naming Convention
  • ¿Versión 1.5.0 o 5.0?
    • “J2SE también mantiene el número de versión 1.5.0 (o 1.5) en algunos lugares que solo son visibles para los desarrolladores, o donde el número de versión es analizado por los progtwigs”
      • “propiedad del sistema java.version
  • Versión 1.6.0 utilizada por los desarrolladores
    • “Java SE mantiene el número de versión 1.6.0 (o 1.6) en algunos lugares que solo son visibles para los desarrolladores o donde los progtwigs analizan el número de versión”.
      • “propiedad del sistema java.version

java.version es una propiedad estándar que existe en todas las java.version .

Solo hay un pequeño truco que puede hacerte la vida más fácil: busca el segundo punto y corta la cuerda allí. Luego conviértalo en double . Ahora puede verificar la versión mucho más cómodamente:

 if (version >= 1.5) ... 

Puede poner esto en el código estático de una clase para que se ejecute solo una vez:

 public static double JAVA_VERSION = getVersion (); static double getVersion () { String version = System.getProperty("java.version"); int pos = version.indexOf('.'); pos = version.indexOf('.', pos+1); return Double.parseDouble (version.substring (0, pos)); } 

¿Qué hay de obtener la versión del paquete meta infos:

 String version = Runtime.class.getPackage().getImplementationVersion(); 

Imprime algo como:

1.7.0_13

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]; 

Desde Java 9, puede usar Runtime.version() :

 Runtime.Version version = Runtime.version(); 
  • Runtime.Version JavaDoc .

No funciona, necesita --pos para evaluar el 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; } 

Solo una nota que en Java 9 y superior, la convención de nomenclatura es diferente. System.getProperty("java.version") devuelve "9" lugar de "1.9" .

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 :) } 

No conozco otra forma de comprobar esto, pero esto: http://java.sun.com/j2se/1.5.0/docs/api/java/lang/System.html#getProperties () “implica” java.version “es una propiedad estándar del sistema, por lo que espero que funcione con otras JVM.

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)); } 

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

Si puede tener dependencia de apache utils, puede usar org.apache.commons.lang3.SystemUtils.

  System.out.println("Is Java version at least 1.8: " + SystemUtils.isJavaVersionAtLeast(JavaVersion.JAVA_1_8));