如何从程序中找到 JVM 版本……以及更多细节?
How to find the JVM version from a program ... with even more details?
我读过this,但还不够好!
我的意思是:当我运行
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 版本 "from within"(正如我链接到的问题所概述的)时,我只看到如下值:
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 的代码。
长话短说:是否有任何程序化的方式来做某事 "within my JVM" 可以提供那种程度的详细信息?
(基本上我需要它来动态禁用我们的一些 JUnit 测试;它们根本无法与较旧的 JVM 一起工作;但我希望它们在 运行 在我的本地 eclipse 安装中使用较新的 JVM 时执行虚拟机)
我没有 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())
);
我读过this,但还不够好!
我的意思是:当我运行
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 版本 "from within"(正如我链接到的问题所概述的)时,我只看到如下值:
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 的代码。
长话短说:是否有任何程序化的方式来做某事 "within my JVM" 可以提供那种程度的详细信息?
(基本上我需要它来动态禁用我们的一些 JUnit 测试;它们根本无法与较旧的 JVM 一起工作;但我希望它们在 运行 在我的本地 eclipse 安装中使用较新的 JVM 时执行虚拟机)
我没有 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())
);