Как найти версию JVM из программы?


116

Я хочу написать образец файла Java, в котором я хочу знать версию JVM, в которой выполняется класс. Есть способ?


3
несколько заметок. Системные свойства предназначены для этого, но имейте в виду, что это привилегированная операция, и код апплеты / веб-запуск / песочница не сможет ее выполнить (получение SecurityException). Обычно вы хотели бы запустить его аналогичным образомAccessController.doPrivileged(new PrivilegedAction<String>(...));
bestsss

3
@bestsss Хотя некоторые свойства доступны только для апплетов, доверенные: java.specification.version, java.versionи java.vm.versionвсе доступны для апплета песка в штучной упаковке, или по крайней мере , они были из 1.6.0_23. Подробнее см. Мой ответ .
Эндрю Томпсон

Также вещь, которая может сработать java -version:)
badp

Ответы:


127

System.getProperty("java.version") возвращает то, что вам нужно.

Вы также можете использовать JMX, если хотите:

ManagementFactory.getRuntimeMXBean().getVmVersion()


6
Этот вызов JMX возвращает эквивалент «java.vm.version», а не «java.version». Обычно (но не обязательно) они совпадают.
Alex Miller

2
ManagementFactory.getRuntimeMXBean (). GetSpecVersion () может быть более точным.
auntyellow

Когда они разные, @AlexMiller? Это звучит интересно.
DavidS 08

1
На самом деле, я бы сказал, что они не такие. Java.vm.version - это номер версии jvm, что-то вроде "25.0-b70", тогда как java.version - это обычная версия языка java, которую вы привыкли видеть "1.8.0".
Alex Miller

3
Стоит отметить, что Java 9 изменит возвращаемое значение из этой строки.
AlBlue

54

Кажется, java.specification.versionэто лучший вариант для работы.

НАПРИМЕР

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

1
java.vm.versionимеет значение null в openjdk-11-headless
User8461 09

@ User8461 Может быть, вам стоит сообщить об ошибке тому, кто курирует открытый JDK. Честно говоря, я не видел особого смысла в обнаружении этой ценности. Вот он сейчас 25.45-b02... что для меня ничего не значит (не дает никакой полезной информации).
Эндрю Томпсон

53

Использование:

System.getProperty("java.version");

Где java.versionможет быть заменено одним из многих других системных свойств, связанных с текущей версией Java. Вот их таблица:

 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

Источники:

  • Вывод java -XshowSettings:all -versionдля различных версий JVM.
  • Справочная документация по Java API для System.getProperties()



1

Ниже java-код возвращает JVMверсии, доступные в вашей текущей среде IDE.

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) {
                  // ...
              }

вывод:

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

1

В зависимости от того, что нужно одному, могут помочь другие ответы.

В моем случае - нет. Я искал "полную" информацию о версии IBM JDK.

Итак, «настоящий» ответ может быть таким: просто сбросьте все системные свойства и проверьте, есть ли такое, которое дает вам то, что вы ищете.

В моем случае; Я обнаружил, что IBM JDK знает

Свойство: java.fullversion

JRE 1.8.0 IBM J9 2.8 Linux amd64-64 Сжатые ссылки 20161013_322271 (JIT включен, AOT включен)

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


1

Просто позвони,

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

Пример вывода:

9
9+176


0

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

32-битное и 64-битное управление Java

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

Вывод :

6
32
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.