Java System.getProperty("java.runtime.version") 未正确报告

Posted

技术标签:

【中文标题】Java System.getProperty("java.runtime.version") 未正确报告【英文标题】:Java System.getProperty("java.runtime.version") not reporting correctly 【发布时间】:2021-11-12 15:00:43 【问题描述】:

我正在运行一个程序,使用:

 System.out.println("Java Virtual Machine implementation version : " + 
         System.getProperty("java.vm.version"));
 System.out.println("Java runtime version: " +  
         System.getProperty("java.runtime.version" ));

这是使用 java 11.0.12+7 编译的。我正在使用 JDK oracle64-1.8.0.192 运行它:

PWRMacbookPro:~ username$ java -version
java version "1.8.0_192"
Java(TM) SE Runtime Environment (build 1.8.0_192-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.192-b12, mixed mode)
PWRMacbookPro:~ username$ 

首先我希望程序使用更高版本编译...但是相反,我得到:

Java Virtual Machine implementation version : 11.0.12+7
Java runtime version: 11.0.12+7

我的 java 环境一定搞砸了?我正在运行 mac os x 并使用 jenv 在不同版本的 java 之间切换。这一切在安装 Azul 11​​.0.12+7 之前都有效。我卸载了 Azul 并返回到 AdoptOpenJDK 11.0.12+7。我搞砸了什么?

编辑:

现在,我很困惑。我回到安装 Azul 之前,一切都一样。我有一个用 java 11 编译的 jar。我现在将正在运行的 JVM 切换到 1.8 并执行我的 jar。我期望并认为我过去得到过“jar 是使用更高版本的 JDK 编译的”或类似的消息。我没有,它运行完美。我错过了什么?

【问题讨论】:

我不确定在安装 Azul 之前您认为发生了什么……但系统属性“java.version”等告诉 JVM,即“运行时” “ 版本。如果您使用 Java 8 JRE 运行......它将报告“1.8”。没有系统属性可以读取您的 app 编译针对的 java 版本,也没有任何方法可以确定版本,除了逐个类。以下是确定类的 Java 版本的方法:f***lee.org/2018/01/19/… 我正在尝试确定我正在运行的 JVM 的版本。在这种情况下,1.8 带有一个在 11 下编译的模块(应该不起作用)。 您根本没有像您声称的那样运行 Java 8。您没有显示用于运行程序的命令行。 【参考方案1】:

我一直在为此绞尽脑汁却一无所获。我有两个 java 程序,我在我的 MAC OS X 系统上变成了 .app 包。今天,我尝试使用 JDK 1.8 在我的 Windows 10 系统上运行 11 版本。它失败了,因为我认为它应该。我突然意识到在 Windows 上,我将它们作为 jar 执行。我在 Mac OS X 上尝试了同样的方法(即运行 jar)。它失败了。我的应用程序包中的启动脚本会查找系统上的***别 JDK,而不是当前活动的 JDK。

我不想承认我在这件事上花了多少时间。

【讨论】:

【参考方案2】:

这些不是完整的时间属性,在运行时读取。这就是为什么你会得到用于运行程序的 JVM 版本

【讨论】:

我没有在运行时获取 JVM 版本,但 JDK 用于编译。

以上是关于Java System.getProperty("java.runtime.version") 未正确报告的主要内容,如果未能解决你的问题,请参考以下文章

java中System.getProperty()的作用及使用

System.getProperty()

Java系统变量信息获取方法System.getenv()与System.getProperty()

Java System.getProperty()

System.getProperty()

Java-System.getProperty()