Come trovare la versione JVM da un programma?


116

Voglio scrivere un file Java di esempio in cui voglio conoscere la versione JVM in cui è in esecuzione la classe. C'è un modo?


3
poche note. Le proprietà di sistema sono pensate per questo, ma tieni presente che si tratta di un'operazione privilegiata e che applet / webstart / codice sand boxed non saranno in grado di eseguirla (ottenendo SecurityException). Normalmente ti piacerebbe eseguirlo in modo simileAccessController.doPrivileged(new PrivilegedAction<String>(...));
bestsss

3
@bestsss Mentre alcune proprietà sono disponibili solo per applet che siano sicuri: java.specification.version, java.versione java.vm.versionsono tutti disponibili ad un applet sabbia-scatola, o almeno erano come di 1.6.0_23. Vedi la mia risposta per maggiori dettagli.
Andrew Thompson

Anche una cosa che potrebbe funzionare: java -version:)
badp

Risposte:


127

System.getProperty("java.version") restituisce ciò di cui hai bisogno.

Puoi anche usare JMX se vuoi:

ManagementFactory.getRuntimeMXBean().getVmVersion()


6
Quella chiamata JMX restituisce l'equivalente di "java.vm.version", non "java.version". Questi sono solitamente (ma non necessariamente) gli stessi.
Alex Miller

2
ManagementFactory.getRuntimeMXBean (). GetSpecVersion () potrebbe essere più accurato.
auntyellow

Quando sono diversi, @AlexMiller? Sembra interessante.
DavidS

1
In realtà, direi che non sono la stessa cosa. Java.vm.version è il numero di versione di jvm, qualcosa come "25.0-b70" mentre java.version è la normale versione in linguaggio Java che sei abituato a vedere "1.8.0".
Alex Miller

3
Vale la pena notare che Java 9 cambierà il valore restituito da questa stringa.
AlBlue

54

Sembra che java.specification.versionsia il migliore per il lavoro.

PER ESEMPIO

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è nullo in openjdk-11-headless
User8461

@ User8461 Forse dovresti segnalare un bug a chiunque sovrintenda al JDK aperto. Ad essere onesti, non ho visto molto utile scoprire quel valore. Qui è attualmente 25.45-b02.. il che non significa nulla (non fornisce informazioni utili) per me.
Andrew Thompson

53

Uso:

System.getProperty("java.version");

Where java.versionpuò essere sostituito con una delle molte altre proprietà di sistema relative alla versione corrente di Java. Eccone una tabella:

 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

fonti:

  • Output di java -XshowSettings:all -versionper una varietà di versioni JVM.
  • Documentazione di riferimento API Java per System.getProperties()

12

Semplicemente un caso di chiamata System.getProperty("java.version").



1

Di seguito il codice java restituisce le JVMversioni disponibili nell'IDE corrente

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

produzione:

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

A seconda di ciò di cui si ha bisogno, le altre risposte possono aiutare.

Nel mio caso, non l'hanno fatto. Stavo cercando le informazioni sulla versione "pienamente qualificata" di un JDK IBM.

Quindi, la risposta "reale" può essere: scarica tutte le proprietà del sistema e controlla se ce n'è una che ti dà quello che stai cercando.

Nel mio caso; Ho scoperto che IBM JDK conosce un file

Proprietà: java.fullversion

Riferimenti compressi JRE 1.8.0 IBM J9 2.8 Linux amd64-64 20161013_322271 (abilitato JIT, abilitato 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

Basta semplicemente chiamare,

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

Output di esempio:

9
9+176


0

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

Controllo Java a 32 bit e 64 bit

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

Produzione :

6
32
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.