จะค้นหาเวอร์ชัน JVM จากโปรแกรมได้อย่างไร?


116

ฉันต้องการเขียนไฟล์ Java ตัวอย่างซึ่งฉันต้องการทราบเวอร์ชัน JVM ที่คลาสกำลังทำงานอยู่ มีวิธีไหม?


3
บันทึกเล็กน้อย คุณสมบัติของระบบมีไว้สำหรับสิ่งนั้น แต่โปรดจำไว้ว่ามันเป็นการดำเนินการที่มีสิทธิพิเศษและแอพเพล็ต / webstart / sand boxed code จะไม่สามารถเรียกใช้งานได้ (รับ SecurityException) โดยปกติคุณต้องการเรียกใช้ในลักษณะเดียวกันAccessController.doPrivileged(new PrivilegedAction<String>(...));
ที่สุด

3
@bestsss ในขณะที่คุณสมบัติบางอย่างจะใช้ได้เฉพาะกับแอปเพล็ที่เชื่อถือ: java.specification.version, java.versionและที่มีอยู่ทั้งหมดไปยังแอปเพล็ทรายชนิดบรรจุกล่องหรืออย่างน้อยพวกเขาก็เป็นของjava.vm.version 1.6.0_23ดูคำตอบของฉันสำหรับรายละเอียดเพิ่มเติม
Andrew Thompson

ยังเป็นสิ่งที่อาจใช้งานได้: 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

1
ที่จริงฉันจะบอกว่ามันไม่เหมือนกัน java.vm.version คือหมายเลขเวอร์ชัน jvm เช่น "25.0-b70" ในขณะที่ java.version เป็นเวอร์ชันภาษาจาวาปกติที่คุณคุ้นเคยกับ "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เป็นโมฆะใน openjdk-11-headless
User8461

@ User8461 บางทีคุณควรรายงานข้อผิดพลาดกับใครก็ตามที่ดูแล JDK ที่เปิดอยู่พูดตามตรงฉันไม่เห็นประเด็นมากนักในการค้นหาค่านั้น ตอนนี้คือ25.45-b02.. ซึ่งไม่มีความหมายอะไรเลย (ไม่ให้ข้อมูลที่เป็นประโยชน์) กับฉัน
Andrew Thompson

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 -versionJVM เวอร์ชันต่างๆ
  • เอกสารอ้างอิง 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.