【问题标题】:How to find the JVM version from a program ... with even more details?如何从程序中找到 JVM 版本……还有更多细节?
【发布时间】:2017-06-02 01:09:02
【问题描述】:

我读过this,但它还不够好

我的意思是:当我运行时

java-版本

我明白了:

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 版本时(如我链接到的问题所述),我只看到如下值:

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;但我希望在使用较新 JVM 的本地 eclipse 安装中运行时执行它们)

【问题讨论】:

  • 我检查了 MX bean,它们似乎没有透露更多信息。所以我认为除了读取属性java.home,添加binjava,使用-version 参数执行它并读取并解析输出之外别无他法。

标签: java jvm version


【解决方案1】:

我没有 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())
);

【讨论】:

  • 有趣的事情:我以为只是在回家的路上倾倒所有财产;但完全忘记这个想法。所以,你刚刚击中钉子 - 至少 IBM JDK 具有属性“java.fullversion”,它为我提供了我正在寻找的那些东西!所以,简单但超级有用。以您的方式发送了一堆赞成票...
猜你喜欢
  • 2011-07-03
  • 1970-01-01
  • 1970-01-01
  • 2012-04-04
  • 2016-02-15
  • 2012-07-03
  • 2017-04-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多