java -version与java -fullversion的区别

4

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)

这个链接(在底部)似乎表明fullversion只包含构建号。如果是这样,为什么当我运行这两个时会得到不同的答案?

请注意,此文档完全没有提到fullversion

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

enter image description here

更新
当我运行Windows的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 的那个只是指向最后一个的符号链接。

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

更新2


使用Process Monitor,我可以看到当我在有问题的C:\Windows\System32\java.exe上运行任一命令时,这是所运行的可执行文件(请参见其调用C:\Windows\System32\java.exe上的LoadImage的截图)。两者中也有几个对C:\Windows\SysWOW64\java.exe的引用。我不确定原因。

enter image description here

请注意,我的注册表似乎是正确的。Currentversion为1.8。 enter image description here 另外需要注意的是,C:\Windows\System32\java.exe的时间戳是我知道我安装JRE的那一天。

我的初步想法是Java的安装不正确。我的第二个想法是,也许java.exe足够聪明,只需检查Windows注册表而不是“它自己”,并报告那里的内容。检查您的JavaSoft密钥以查看此系统上安装的64位JRE。我仔细查看了您的帖子,并发现您正在运行System32,尽管它报告为64位服务器VM。请确保这不是您正在运行的那个。 - user1531971
@jdv 我已经查看了注册表并在上面粘贴了一张截图。在我看来,它似乎没问题。我是不是漏掉了什么?而且System32是它正在运行的那个文件夹。在我弄清楚这个程序报告的版本号为什么不同之后,我打算将其删除。 - kmort
谢谢。这只是一个非常特殊的猜测,但至少我们已经排除了它。如果你在两次调用中都使用Java的完整路径名得到相同的结果,我无法给出一个合理的解释。 - user1531971
我没有答案。事实证明,“系统”虚拟机只是指向Windows注册表中最新虚拟机的指针。系统虚拟机也不会随着更新安装而更新。我还看到,最近的Java 8完整版本安装会删除两个系统可执行文件。因此,我们在这里看到的可能与这些可执行文件如何在给定不同选项时找到“最新”的方式有关,或者与运行多个Java 8安装或更新的结果有关,使得这些系统可执行文件处于奇怪的状态。我没有真正的答案。这是一个难题。 - user1531971
2个回答

2
经过反复的讨论,看起来这是Java“更新”安装程序的副作用,因为它没有更新系统目录中的Java可执行文件。曾经,在这台机器上安装了1.8.0_20-b26版本,它忠实地放置了完整的JAVA_HOME、此版本的注册表条目、更新了注册表中的最新VM,并且还将/special/ java.exe放在%WinSysDir%下。在某个时间点,JVM被更新了,可能是通过Java更新程序工具进行的,可能不是通过完整的安装程序(OP可以确认)。这创建了一个新的JAVA_HOME,更新了注册表,甚至可能删除了旧的_20安装。但是,问题在于:它没有删除%WinSysDir%中的java.exe。@kmort在可执行文件上运行了POSIX字符串,并发现"1.8.0_20-b26"确实被埋藏在那个旧的可执行文件中。所以,正在发生的事情是对-version选项,它会检查最新的JVM的注册表并使用该选项调用它(或者只是从注册表返回FullVersion--直到我们跟踪系统调用,我们不知道)。但是对于-fullversion,它只会返回可执行文件内部的静态字符串!我怀疑-version可以采用optarg的事实意味着这些选项的处理完全不同。解决方案是:1.只需删除%WinSysDir%中的java.exe;2.接受它,因为它很可能是无害的(除非-version处理实际上调用了不是最新的真正JRE,否则所有赌注都关闭);3.使用Oracle的最新MSI从头重新安装Java 8。 (3)应该替换%WinSysDir%中的java.exe(以及WOW64系统java.exe)。(1)可能完全没问题。(2)如果-version导致java.exe走神并调用不是最新版本的真正JRE,则可能存在错误。

嗯。所以有些人说 C:\Windows\System32\java.exe 是一个“虚拟”文件,它会选择注册表中设置的内容并指向它,而其他人则说它是 JRE 安装的实际 Java.exe 的副本。简单的校验和显示它们不同(与32位或64位版本不匹配)。所以我倾向于认为它是一个“虚拟”的,但这并不能解释为什么我根据传递的命令行参数得到不同版本的结果。我不担心32位与64位之间的区别,我担心实际版本号的差异。谢谢 jdv。 - kmort
你尝试使用绝对路径运行这两个选项了吗?虽然我通常会同意路径上的任何内容都是路径上的任何内容,但在这种情况下,有些事情非常奇怪。 - user1531971
是的(好吧,不是绝对路径,而是从每个文件夹开始,这意味着Windows会首先找到它)。所有在“Program Files”中的32位和64位都按预期功能运行。奇怪的是C:\windows\system32\java.exe文件夹和C:\windows\SysWow64\java.exe。它们都会报告奇数。我希望我能弄清楚这个问题。 :-) - kmort
几乎可以确定是注册表的问题,或者是系统Java可执行文件与注册表值结合运行时所产生的复合问题。由于我们知道它们会检查注册表,那么请问你的"HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java RuntimeEnvironment\1.8"是什么?这两个可执行文件绝对是特殊的。我和你一样感到困惑。 - user1531971
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/72370/discussion-between-jdv-and-kmort - user1531971
显示剩余2条评论

1
我尝试重现结果,两个命令都得到了相同的Java版本。因此,我认为在Java文件夹中拥有多个JRE可能会导致结果不一致。 cmd结果

enter image description here

我的JRE在C:\Program Files (x86)\Java内

enter image description here


我其他的机器也有相同的结果。只有这个有问题。我尝试了你的理论,移动了额外的JRE/JDK包,但问题仍然存在。我以为可能是因为32/64位的问题,但问题仍然存在。不过还是谢谢你的好意。 :-) - kmort
@kmort,不要移动额外的JRE/JDK包,尝试删除它们并检查结果。希望这样可以解决问题。 - Prudhvi
1
我不确定那会有什么影响。我的路径没有改变,而且我还将JRE/JDK包移出了设定路径。除非有一些我不知道的奇怪机制,否则我的命令行不可能解析到我移动的这些包。我是不是漏掉了什么? - kmort

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接