¿Cómo encontrar la versión de JVM de un programa?

116

Quiero escribir un archivo Java de muestra en el que quiero saber la versión de JVM en la que se está ejecutando la clase. ¿Hay alguna manera?

java_geek
fuente
3
pocas notas. Las propiedades del sistema están diseñadas para eso, pero TENGA en cuenta que es una operación privilegiada y que los applets / webstart / código de caja de arena no podrán ejecutarlo (obteniendo SecurityException). Normalmente le gustaría ejecutarlo de manera similarAccessController.doPrivileged(new PrivilegedAction<String>(...));
bestsss
3
@bestsss Mientras que algunas propiedades sólo están disponibles para los applets que son de confianza: java.specification.version, java.versiony java.vm.versionestán disponibles a un applet de arena en caja, o por lo menos eran como de 1.6.0_23. Vea mi respuesta para más detalles.
Andrew Thompson
También es algo que puede funcionar java -version:)
badp
2
Posible duplicado de Obtener la versión de Java en tiempo de ejecución
BuZZ-dEE

Respuestas:

127

System.getProperty("java.version") devuelve lo que necesita.

También puede usar JMX si lo desea:

ManagementFactory.getRuntimeMXBean().getVmVersion()

AlexR
fuente
6
Esa llamada JMX devuelve el equivalente de "java.vm.version", no "java.version". Suelen ser (pero no necesariamente) iguales.
Alex Miller
2
ManagementFactory.getRuntimeMXBean (). GetSpecVersion () puede ser más preciso.
auntyellow
¿Cuándo son diferentes, @AlexMiller? Eso suena interesante.
DavidS
1
De hecho, diría que no son lo mismo. Java.vm.version es el número de versión de jvm, algo así como "25.0-b70", mientras que java.version es la versión normal del lenguaje java que está acostumbrado a ver "1.8.0".
Alex Miller
3
Vale la pena señalar que Java 9 cambiará el valor devuelto de esta cadena.
AlBlue
54

Parece el java.specification.version es el mejor para el trabajo.

P.EJ

java.specification.version  1.6
java.version    1.6.0_23
java.vm.version 19.0-b09
java.runtime.version    1.6.0_23-b05
Andrew Thompson
fuente
1
java.vm.versiones nulo en openjdk-11-headless
User8461
@ User8461 Tal vez debería presentar un informe de error con quien supervise el JDK abierto. Para ser honesto, no he visto mucho sentido en averiguar ese valor. Aquí está actualmente 25.45-b02... lo que no significa nada (no proporciona información útil) para mí.
Andrew Thompson
53

Utilizar:

System.getProperty("java.version");

Where java.versionse puede reemplazar con una de las muchas otras propiedades del sistema relacionadas con la versión actual de Java. Aquí hay una tabla de ellos:

 Property                        Value (OpenJDK 12)                        Value (Oracle JRE 8u201)                Value (Sun JRE 5u22)                                 Description
------------------------------- ----------------------------------------- --------------------------------------- ---------------------------------------------------- ---------------------------------------------------------------------------------------------------------------
 java.version                    "12"                                      "1.8.0_201"                             "1.5.0_22"                                           Java Runtime Environment version, which may be interpreted as a Runtime.Version
 java.version.date               "2019-03-19"                              null                                    null                                                 Java Runtime Environment version date, in ISO-8601 YYYY-MM-DD format, which may be interpreted as a LocalDate
 java.vendor                     "Oracle Corporation"                      "Oracle Corporation"                    "Sun Microsystems Inc."                              Java Runtime Environment vendor
 java.vendor.version             null                                      null                                    null                                                 Java vendor version
 java.vendor.url                 "https://java.oracle.com/"                "http://java.oracle.com/"               "http://java.sun.com/"                               Java vendor URL
 java.vendor.url.bug             "https://bugreport.java.com/bugreport/"   "http://bugreport.sun.com/bugreport/"   "http://java.sun.com/cgi-bin/bugreport.cgi"          Undocumented
 java.specification.name         "Java Platform API Specification"         "Java Platform API Specification"       "Java Platform API Specification"                    Java Runtime Environment specification name
 java.specification.vendor       "Oracle Corporation"                      "Oracle Corporation"                    "Sun Microsystems Inc."                              Java Runtime Environment specification vendor
 java.specification.version      "12"                                      "1.8"                                   "1.5"                                                Java Runtime Environment specification version, whose value is the feature element of the runtime version
 java.vm.name                    "OpenJDK 64-Bit Server VM"                "Java HotSpot(TM) 64-Bit Server VM"     "Java HotSpot(TM) 64-Bit Server VM"                  Java Virtual Machine implementation name
 java.vm.vendor                  "Oracle Corporation"                      "Oracle Corporation"                    "Sun Microsystems Inc."                              Java Virtual Machine implementation vendor
 java.vm.version                 "12+33"                                   "25.201-b09"                            "1.5.0_22-b03"                                       Java Virtual Machine implementation version which may be interpreted as a Runtime.Version
 java.vm.info                    "mixed mode, sharing"                     "mixed mode"                            "mixed mode"                                         Undocumented
 java.vm.specification.name      "Java Virtual Machine Specification"      "Java Virtual Machine Specification"    "Java Virtual Machine Specification"                 Java Virtual Machine specification name
 java.vm.specification.vendor    "Oracle Corporation"                      "Oracle Corporation"                    "Sun Microsystems Inc."                              Java Virtual Machine specification vendor
 java.vm.specification.version   "12"                                      "1.8"                                   "1.0"                                                Java Virtual Machine specification version, whose value is the feature element of the runtime version
 java.runtime.name               "OpenJDK Runtime Environment"             "Java(TM) SE Runtime Environment"       "Java(TM) 2 Runtime Environment, Standard Edition"   Undocumented
 java.runtime.version            "12+33"                                   "1.8.0_201-b09"                         "1.5.0_22-b03"                                       Undocumented
 java.class.version              "56.0"                                    "52.0"                                  "49.0"                                               Java class format version number
 jdk.debug                       "release"                                 null                                    null                                                 Undocumented
 sun.java.launcher               "SUN_STANDARD"                            "SUN_STANDARD"                          "SUN_STANDARD"                                       Undocumented
 sun.management.compiler         "HotSpot 64-Bit Tiered Compilers"         "HotSpot 64-Bit Tiered Compilers"       "HotSpot 64-Bit Server Compiler"                     Undocumented

Fuentes:

  • Salida de java -XshowSettings:all -versionpara una variedad de versiones de JVM.
  • Documentación de referencia de la API de Java para System.getProperties()
Sean Patrick Floyd
fuente
12

Simplemente un caso de llamada System.getProperty("java.version").

Finbarr
fuente
1

A continuación, el código de Java devuelve JVMversiones que están disponibles en su IDE actual

List<VirtualMachineDescriptor> descriptors = VirtualMachine.list();
          for (VirtualMachineDescriptor descriptor : descriptors) {
              System.out.println("Found JVM: " + descriptor.displayName());
              try {
                  VirtualMachine vm = VirtualMachine.attach(descriptor);
                  String version = vm.getSystemProperties().getProperty("java.runtime.version");
                  System.out.println("   Runtime Version: " + version);

                   String connectorAddress = vm.getAgentProperties().getProperty("com.sun.management.jmxremote.localConnectorAddress");
                  if (connectorAddress == null) {

                      connectorAddress = vm.getAgentProperties().getProperty("com.sun.management.jmxremote.localConnectorAddress");
                  }

                  JMXServiceURL url = new JMXServiceURL(connectorAddress);
                  JMXConnector connector = JMXConnectorFactory.connect(url);
                  MBeanServerConnection mbs = connector.getMBeanServerConnection();

                  ObjectName threadName = new ObjectName(ManagementFactory.THREAD_MXBEAN_NAME);
                  Integer threadCount = (Integer)mbs.getAttribute(threadName, "ThreadCount");
                  System.out.println("    Thread count: " + threadCount);
              }
              catch (Exception e) {
                  // ...
              }

salida:

Found JVM: /home/.../STS IDE/sts-bundle/sts-3.7.2.RELEASE//plugins/org.eclipse.equinox.launcher_1.3.100.v20150511-1540.jar -os linux -ws gtk -arch x86_64 -showsplash -launcher /home/.../STS IDE/sts-bundle/sts-3.7.2.RELEASE/STS -name STS --launcher.library /home/.../STS IDE/sts-bundle/sts-3.7.2.RELEASE//plugins/org.eclipse.equinox.launcher.gtk.linux.x86_64_1.1.300.v20150602-1417/eclipse_1612.so -startup /home/.../STS IDE/sts-bundle/sts-3.7.2.RELEASE//plugins/org.eclipse.equinox.launcher_1.3.100.v20150511-1540.jar --launcher.overrideVmargs -exitdata 1ad000f -product org.springsource.sts.ide -vm /usr/bin/java -vmargs -Dosgi.requiredJavaVersion=1.7 -Xms40m -XX:MaxPermSize=256m -Xverify:none -Xmx1200m -jar /home/.../STS IDE/sts-bundle/sts-3.7.2.RELEASE//plugins/org.eclipse.equinox.launcher_1.3.100.v20150511-1540.jar
   Runtime Version: 1.8.0_91-b14
Found JVM: com.intellij.idea.Main
   Runtime Version: 1.8.0_91-b14
Found JVM: Test
   Runtime Version: 1.7.0_80-b15

fuente
1

Dependiendo de lo que uno necesite, las otras respuestas pueden ayudar.

En mi caso, no lo hicieron. Estaba buscando la información de la versión "totalmente calificada" de un IBM JDK.

Entonces, la respuesta "real" puede ser: simplemente descargue todas las propiedades del sistema y verifique si hay alguna que le proporcione lo que está buscando.

En mi caso; Descubrí que IBM JDK conoce un

Propiedad: java.fullversion

JRE 1.8.0 IBM J9 2.8 Linux amd64-64 Compressed References 20161013_322271 (JIT habilitado, AOT habilitado)

J9VM - R28_Java8_SR3_20161013_1635_B322271

JIT - tr.r14.java.green_20161011_125790

GC - R28_Java8_SR3_20161013_1635_B322271_CMPRSS J9CL - 20161013_322271

GhostCat
fuente
1

Simplemente llama

System.out.println(System.getProperty("java.specification.version"));
System.out.println(System.getProperty("java.runtime.version"));

Salida de ejemplo:

9
9+176
snr
fuente
0

System.getProperty ("sun.arch.data.model");

Control de Java de 32 bits y 64 bits

    Integer vers = Integer.parseInt(System.getProperty("java.version").split("\\.")[1]);
    String bitMode = System.getProperty("sun.arch.data.model").toString();
    System.out.println(vers);
    System.out.println(bitMode);

Salida:

6
32
umut.bayram
fuente