Comment trouver la version JVM d'un programme?

116

Je souhaite écrire un exemple de fichier Java dans lequel je souhaite connaître la version JVM dans laquelle la classe s'exécute. Y a-t-il un moyen?

java_geek
la source
3
quelques notes. Les propriétés système sont destinées à cela, mais gardez à l'esprit qu'il s'agit d'une opération privilégiée et que le code applets / webstart / sand box ne pourra pas l'exécuter (obtenant SecurityException). Normalement, vous souhaitez l'exécuter de la même manièreAccessController.doPrivileged(new PrivilegedAction<String>(...));
bestsss
3
@bestsss Bien que certaines propriétés ne sont disponibles que pour les applets qui ont fait confiance: java.specification.version, java.versionet java.vm.versionsont disponibles à un applet de sable boxed, ou tout au moins ils étaient aussi de 1.6.0_23. Voir ma réponse pour plus de détails.
Andrew Thompson
Aussi une chose qui peut fonctionner: java -version:)
badp
2
Possible duplication de Obtenir la version Java au moment de l'exécution
BuZZ-dEE

Réponses:

127

System.getProperty("java.version") renvoie ce dont vous avez besoin.

Vous pouvez également utiliser JMX si vous le souhaitez:

ManagementFactory.getRuntimeMXBean().getVmVersion()

AlexR
la source
6
Cet appel JMX renvoie l'équivalent de "java.vm.version", et non de "java.version". Ce sont généralement (mais pas nécessairement) les mêmes.
Alex Miller
2
ManagementFactory.getRuntimeMXBean (). GetSpecVersion () peut être plus précis.
auntyellow
Quand sont-ils différents, @AlexMiller? Cela semble intéressant.
DavidS
1
En fait, je dirais qu'ils ne sont pas les mêmes. Le java.vm.version est le numéro de version de jvm, quelque chose comme "25.0-b70" tandis que le java.version est la version normale du langage Java que vous avez l'habitude de voir "1.8.0".
Alex Miller
3
Il convient de noter que Java 9 modifiera la valeur renvoyée par cette chaîne.
AlBlue
54

Il semble que ce java.specification.versionsoit le meilleur pour le travail.

PAR EXEMPLE

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
Andrew Thompson
la source
1
java.vm.versionest nul dans openjdk-11-headless
User8461
@ User8461 Vous devriez peut-être signaler un bogue à celui qui supervise le JDK ouvert. Pour être honnête, je n'ai pas vu grand chose pour découvrir cette valeur. Le voici actuellement 25.45-b02.. ce qui ne veut rien dire (ne me donne aucune information utile).
Andrew Thompson
53

Utilisation:

System.getProperty("java.version");

java.versionpeut être remplacé par l'une des nombreuses autres propriétés système liées à la version Java actuelle. En voici un tableau:

 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

Sources:

  • Sortie de java -XshowSettings:all -versionpour une variété de versions JVM.
  • Documentation de référence de l'API Java pour System.getProperties()
Sean Patrick Floyd
la source
12

Simplement une affaire d'appels System.getProperty("java.version").

Finbarr
la source
1

Le code java ci-dessous renvoie les JVMversions disponibles dans votre IDE actuel

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

production:

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

la source
1

En fonction de ce dont on a besoin, les autres réponses peuvent aider.

Dans mon cas, ils ne l'ont pas fait. Je cherchais les informations de version "pleinement qualifiées" d'un IBM JDK.

Ainsi, la "vraie" réponse peut être: vider simplement toutes les propriétés du système et vérifier s'il y en a une qui vous donne ce que vous recherchez.

Dans mon cas; J'ai constaté que le JDK IBM connaît un

Propriété: java.fullversion

JRE 1.8.0 IBM J9 2.8 Linux amd64-64 Références compressées 20161013_322271 (JIT activé, AOT activé)

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

GhostCat
la source
1

Appelez simplement,

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

Exemple de sortie:

9
9+176
snr
la source
0

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

Contrôle Java 32 bits et 64 bits

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

Production :

6
32
umut.bayram
la source