Làm thế nào để tìm phiên bản JVM từ một chương trình?


116

Tôi muốn viết một tệp Java mẫu trong đó tôi muốn biết phiên bản JVM mà lớp đang chạy. Là có một cách?


3
vài ghi chú. Các thuộc tính hệ thống dành cho điều đó nhưng hãy nhớ rằng đó là một hoạt động đặc quyền và các applet / webstart / sandbox code sẽ không thể thực thi nó (nhận SecurityException). Thông thường, bạn muốn chạy nó theo cách tương tựAccessController.doPrivileged(new PrivilegedAction<String>(...));
bestsss

3
@bestsss Trong khi một số đặc tính chỉ có sẵn cho các applet được tin cậy: java.specification.version, java.version& java.vm.versionđều có sẵn để một applet cát đóng hộp, hoặc ít nhất là họ đã tính đến 1.6.0_23. Xem câu trả lời của tôi để biết thêm chi tiết.
Andrew Thompson

Ngoài ra một điều có thể hoạt động: java -version:)
badp 23/2/2017

2
Bản sao có thể có của Phiên bản Java khi chạy
BuZZ-dEE

Câu trả lời:


127

System.getProperty("java.version") trả lại những gì bạn cần

Bạn cũng có thể sử dụng JMX nếu bạn muốn:

ManagementFactory.getRuntimeMXBean().getVmVersion()


6
Cuộc gọi JMX đó trả về tương đương với "java.vm.version", không phải "java.version". Đây thường là (nhưng không nhất thiết) như nhau.
Alex Miller

2
ManagementFactory.getR nbMXBean (). GetSpecVersion () có thể chính xác hơn.
dì 9/12/14

Khi nào thì chúng khác nhau, @AlexMiller? Nghe có vẻ thú vị.
DavidS

1
Thật ra, tôi muốn nói rằng chúng không giống nhau. Java.vm.version là số phiên bản jvm, đại loại như "25.0-b70" trong khi java.version là phiên bản ngôn ngữ java bình thường mà bạn đã từng thấy "1.8.0".
Alex Miller

3
Đáng lưu ý rằng Java 9 sẽ thay đổi giá trị được trả về từ chuỗi này.
AlBlue

54

Có vẻ như java.specification.versionlà tốt nhất cho công việc.

VÍ DỤ

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.versionlà null trong openjdk-11-không đầu
Người dùng8461

@ User8461 Có lẽ bạn nên đưa ra một báo cáo lỗi với bất kỳ ai giám sát JDK đang mở, Thành thật mà nói tôi không thấy nhiều điểm để tìm ra giá trị đó. Hiện tại nó đang ở đây 25.45-b02.. có nghĩa là không có gì (không cung cấp thông tin hữu ích) cho tôi.
Andrew Thompson

53

Sử dụng:

System.getProperty("java.version");

Nơi java.versioncó thể được thay thế bằng một trong nhiều thuộc tính hệ thống khác liên quan đến phiên bản Java hiện tại. Đây là bảng của họ:

 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

Nguồn:

  • Đầu ra của java -XshowSettings:all -version cho một loạt các phiên bản JVM.
  • Tài liệu tham khảo API Java cho System.getProperties()

12

Đơn giản chỉ là một trường hợp gọi System.getProperty("java.version").



1

Bên dưới mã java trả về JVMcác phiên bản có sẵn trong IDE hiện tại của bạn

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

đầu ra:

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

Tùy thuộc vào những gì một người cần, các câu trả lời khác có thể giúp đỡ.

Trong trường hợp của tôi, họ đã không làm thế. Tôi đang tìm kiếm thông tin phiên bản "đủ điều kiện" của IBM JDK.

Vì vậy, câu trả lời "thực" có thể là: chỉ cần bỏ tất cả các thuộc tính hệ thống và kiểm tra xem có thuộc tính nào cung cấp cho bạn những gì bạn đang tìm kiếm không.

Trong trường hợp của tôi; Tôi thấy rằng IBM JDK biết một

Tài sản: java.fullversion

JRE 1.8.0 IBM J9 2.8 Linux amd64-64 Tài liệu tham khảo được nén 20161013_322271 (bật JIT, bật 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

Chỉ cần gọi,

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

Ví dụ đầu ra:

9
9+176


0

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

Kiểm soát 32 bit và 64 bit 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);

Đầu ra:

6
32
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.