如何从程序中找到JVM版本......还有更多细节?

时间:2017-01-17 20:16:06

标签: java jvm version

我已阅读this,但 ain不够好

我的意思是:当我跑步时

  

java -version

我明白了:

java version "1.8.0"
Java(TM) SE Runtime Environment (build pxa6480sr3fp20-20161019_02(SR3 FP20))
IBM J9 VM (build 2.8, JRE 1.8.0 Linux amd64-64 Compressed References 20161013_322271 (JIT enabled, AOT enabled)
J9VM - R28_Java8_SR3_20161013_1635_B322271
JIT  - tr.r14.java.green_20161011_125790
GC   - R28_Java8_SR3_20161013_1635_B322271_CMPRSS

...

但是当我使用任何编程方式来访问JVM版本时,#34; (正如我所链接的问题所述),我只看到诸如以下的值:

Property: java.vm.specification.version   : 1.8
Property: java.vm.specification.vendor    : Oracle Corporation
Property: java.vm.specification.name      : Java Virtual     Machine Specification
Property: java.vm.version                 : 2.8
Property: java.vm.vendor                  : IBM Corporation
Property: java.vm.name                    : IBM J9 VM
Property: java.specification.version      : 1.8
Property: java.specification.vendor       : Oracle Corporation
Property: java.specification.name         : Java Platform API Specification

使用

MX bean --- vmversion: 2.8

我的问题:我们的构建服务器运行一个稍微版本的IBM java。 java -version会显示,就像

一样
J9VM - R28_Java8_SR1_20150410_1531_B243669 

但是:当我打印这些系统属性时,这些细节就丢失了!我还没有找到一种编写java代码的方法,可以将较旧的JVM与较新的JVM区分开来。

长话短说:在我的JVM"中是否有任何编程方式可以做某事"那会给我那么详细的水平吗?

(基本上我需要它来动态地禁用我们的一些JUnit测试;他们根本不使用旧的JVM;但是我希望它们在我的本地eclipse安装中使用更新的JVM运行时执行)

1 个答案:

答案 0 :(得分:4)

我没有IBM Java,只有Oracle Java。当我做java -version时,我得到了:

java version "1.8.0_91"
Java(TM) SE Runtime Environment (build 1.8.0_91-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.91-b14, mixed mode)

我可以使用以下代码重现那个确切的输出:

System.out.printf("java version \"%s\"%n" +
                  "%s (build %s)%n" +
                  "%s (build %s, %s)%n",
                  System.getProperty("java.version"),
                  System.getProperty("java.runtime.name"),
                  System.getProperty("java.runtime.version"),
                  System.getProperty("java.vm.name"),
                  System.getProperty("java.vm.version"),
                  System.getProperty("java.vm.info"));

IBM Java可能还添加了其他信息。为什么不尝试转储所有系统属性并自己查看:

new TreeMap<>(System.getProperties()).entrySet().forEach(e ->
        System.out.printf("%s = %s%n", e.getKey(), e.getValue())
);