Come trovare la versione JVM da un programma?

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

System.getProperty("java.version") restituisce quello che ti serve.

Puoi anche usare JMX se vuoi:

ManagementFactory.getRuntimeMXBean().getVmVersion()

Sembra che java.specification.version sia la migliore per il lavoro.

Ad esempio, da un’applet in uno dei miei vecchi siti:

 java.specification.version 1.6 java.version 1.6.0_23 java.vm.version 19.0-b09 java.runtime.version unknown 

Il valore unknown per java.runtime.version significa semplicemente che l’applet non è attendibile. Eccolo nella versione attendibile:

 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 
 System.getProperty("java.version") 

Ecco un elenco di proprietà di sistema standard, tra cui:

  • java.vm.specification.version Versione specifica di Java Virtual Machine
  • java.vm.specification.vendor Fornitore di specifiche Java Virtual Machine
  • java.vm.specification.name Nome della specifica Java Virtual Machine
  • java.vm.version Versione di implementazione Java Virtual Machine
  • java.vm.vendor Fornitore di implementazione Java Virtual Machine
  • java.vm.name Nome di implementazione Java Virtual Machine
  • java.specification.version Versione specifica di Java Runtime Environment
  • java.specification.vendor Fornitore di specifiche Java Runtime Environment
  • java.specification.name Nome della specifica di Java Runtime Environment

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

Esempi che utilizzano java.version , java.specification.version e java.runtime.version : java.runtime.version versione di java in runtime .

Sotto il codice java restituisce le versioni JVM disponibili nell’ID corrente

 List 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 

A seconda di cosa si ha bisogno, le altre risposte possono aiutare.

Nel mio caso, non l’hanno fatto. Stavo cercando le informazioni sulla versione “completa” di un JDK IBM.

Quindi, la “vera” risposta può essere: basta scaricare tutte le proprietà del sistema e controllare se ce n’è una che ti dia quello che stai cercando.

Nel mio caso; Ho scoperto che IBM JDK conosce a

Proprietà: java.fullversion

JRE 1.8.0 IBM J9 2.8 Linux amd64-64 Riferimenti compressi 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

Le informazioni sulle versioni sono archiviate come proprietà della class System .

http://docs.oracle.com/javase/6/docs/api/java/lang/System.html#getProperties%28%29

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 

Basta chiamare,

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

Esempio di output:

 9 9+176