java -version 与 java -fullversion

标签 java

java -versionjava -fullversion 有什么区别?

这两个在我的机器上好像没有对齐

C:\Users\kmort>java -fullversion
    java full version "1.8.0_20-b26"

C:\Users\kmort>java -version
    java version "1.8.0_25"
    Java(TM) SE Runtime Environment (build 1.8.0_25-b18)
    Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)

This link (at the bottom)似乎表明 fullversion 只包含内部版本号。如果这是真的,那么当我运行这两个时我最终会得到不同的答案怎么办?

请注意 this documentation忽略完全引用 fullversion

我在 64 位 Windows 7 上运行。如果有帮助,这里是我在我的机器上安装的 JDK 和 JRE 的屏幕截图。

enter image description here

更新


当我运行 Window 的 where 命令时,我得到以下信息:

C:\Users\kmort>where java
C:\Windows\System32\java.exe
C:\ProgramData\Oracle\Java\javapath\java.exe
C:\Program Files\Java\jdk1.8.0_25\bin\java.exe

问题出在 System32 中的 java.exe。如果我将该名称重命名为其他名称,一切都会按预期进行。而 Oracle 只是指向最后一个的符号链接(symbolic link)。

那么现在的问题是,为什么我的 System32 文件夹中的 java.exe 会发生这种情况? (我的最终目标是从 System32 文件夹中删除 java.exe,但我想先了解发生了什么。)

更新 2


使用 Process Monitor,我可以看到,当我在有问题的 C:\Windows\System32\java.exe 上运行任一命令时,这是正在运行的可执行文件(请参阅它调用的屏幕截图LoadImageC:\Windows\System32\java.exe 上)。它们中还有一些对 C:\Windows\SysWOW64\java.exe 的引用。我不确定为什么。

enter image description here

另请注意,我的注册表似乎是正确的。当前版本是 1.8。 enter image description here

另外请注意,C:\Windows\System32\java.exe 上的时间戳是在我知道我安装了 JRE 的那一天。

最佳答案

经过多次反复,看起来这是 Java“更新”安装的副作用,没有更新系统目录中的 Java 可执行文件。

曾几何时,这台机器上安装了 1.8.0_20-b26,它尽职尽责地放下了一个完整的 JAVA_HOME,这个版本的注册表项,更新了注册表中的最新 VM,并且还把/special/java %WinSysDir% 中的 .exe

在某些时候,JVM 已更新,可能是通过 Java 更新程序工具,但可能没有使用完整的安装程序(OP 可以确认。)

这会创建一个新的 JAVA_HOME,更新注册表,甚至可能删除旧的 _20 安装。但是,更重要的是:它没有删除 %WinSysDir% 中的 java.exe

@kmort 在可执行文件上运行 POSIX 字符串,发现“1.8.0_20-b26”确实隐藏在那个旧的可执行文件中。

所以,对于 -version 选项,它会检查注册表以获取最新的 JVM 并使用选项 调用它(或者只是从注册表返回 FullVersion——我们不知道直到我们跟踪系统调用) [它似乎实际上调用了可执行文件 --jdv]。但是对于 -fullversion 它只会返回可执行文件中的静态字符串!

我怀疑 -version 可以采用 optarg 这一事实意味着对这些选项的处理是完全不同的。

解决方案是:

  1. 只需删除 %WinSysDir% 中的 java.exe

  2. 接受它,因为它可能是无害的(除非 -version 处理实际上调用了不同的 JVM,在这种情况下,所有的赌注都没有了)

  3. 使用来自 Oracle 的最新 MSI 从头开始​​重新安装 Java 8。

(3) 应该替换 %WinSysDir% 中的 java.exe(以及 WOW64 系统 java.exe)。 (1) 可能完全没问题。 (2) 如果 -version 导致 java.exe 偏离并调用不是最新的真实 JRE,则可能是一个错误。

关于java -version 与 java -fullversion,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28749535/

相关文章:

java - 将图像转换为按钮数组

java - 计算时在 JTextArea 中显示文本

java - 使用优先级队列在java中进行模拟

java - 如何让大组件在使用JGoodies FormLayout时不至于炸毁布局?

java - setUserVisibleHint 中的空上下文

java - 子类构造函数

java - GC 静态对象引用为 null

java - 将从安卓设备接收到的数据输出为声音

java - 单链表清空后仍然消耗内存

java - 为什么 ToolkitImage getBufferedImage() 返回 null?