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


116

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


3
кілька приміток. Властивості системи призначені для цього, але врахуйте, що це привілейована операція, і аплети / webstart / пісочний код не зможуть виконати її (отримати 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". Зазвичай вони (але не обов'язково) однакові.
Алекс Міллер

2
ManagementFactory.getRuntimeMXBean (). GetSpecVersion () може бути більш точним.
тітка

Коли вони відрізняються, @AlexMiller? Це звучить цікаво.
DavidS

1
Насправді я б сказав, що вони не однакові. Java.vm.version - номер версії jvm, щось на зразок "25.0-b70", тоді як java.version - це звичайна версія мови Java, яку ви звикли бачити "1.8.0".
Алекс Міллер

3
Варто зазначити, що Java 9 змінить повернене значення з цього рядка.
AlBlue

54

Здається java.specification.version, найкраще для роботи.

EG

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 Можливо, ви повинні підняти звіт про помилку з тим, хто контролює відкритий 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");

Java 32-бітний та 64-бітний контроль

    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.