【问题标题】:java -version vs java -fullversionjava -version 与 java -fullversion
【发布时间】:2015-02-26 17:59:46
【问题描述】:

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 的屏幕截图。

更新


当我运行 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 只是到最后一个的符号链接。

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

更新 2


使用进程监视器,我可以看到,当我在有问题的C:\Windows\System32\java.exe 上运行任一命令时,这是正在运行的可执行文件(请参阅它在C:\Windows\System32\java.exe 上调用LoadImage 的屏幕截图)。两者中也有一些对C:\Windows\SysWOW64\java.exe 的引用。我不知道为什么。

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

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

【问题讨论】:

  • 我最初的想法是这个Java的安装是不正确的。我的第二个问题是,也许 java.exe 足够聪明,可以只检查 Windows 注册表而不是“它本身”,它会报告那里的内容。检查您的 JavaSoft 密钥以查看此系统上已安装的 64 位 JRE。我只是更仔细地查看了您的帖子,发现您正在用完 System32,尽管它报告的是 64 位服务器 VM。确保这是你没有运行的那个。
  • @jdv 我查看了注册表并粘贴了上面的屏幕截图。对我来说似乎没问题。我错过了什么吗?而 System32 就是它正在运行的那个。当我明白为什么这个生物报告的版本号不同时,我将删除它。
  • 谢谢。这肯定只是一个真正的离群值猜测,但至少我们已经排除了它。如果使用两个调用的完整路径名运行 java 得到相同的结果,我没有明智的解释。
  • 我没有答案。事实证明,“系统”虚拟机只是指向 Windows 注册表中最新虚拟机的指针。系统 VM 也不会通过更新安装进行更新。我还在阅读最新的 Java 8 完整版本安装了 REMOVE 两个系统可执行文件。因此,我们在这里看到的可能与这些可执行文件在给定不同选项和/或多个 Java 8 安装或更新运行的人工制品时如何找到“最新”有关,从而使这些系统可执行文件处于奇怪的状态。我没有真正的答案。这是一个笨蛋。

标签: java


【解决方案1】:

经过多次反复,看起来这是 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 ——我们不知道直到我们跟踪系统调用) [它似乎实际上调用了可执行文件--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,则可能是一个错误。

【讨论】:

  • 感谢 jdv。 C:\Windows\System32\java.exe 文件上的时间戳是在我知道我安装了 JRE 的那一天,所以我很确定它来自 Oracle。
  • @kmort 怎么样。很高兴知道。这解释了一些事情:stackoverflow.com/questions/11063831/… 由于某种原因我没有 system32 java,但我不断安装和更新 JRE。它一定在某个时候被删除了。有趣的是 System32 java IS 派生自 Windows 注册表。进一步阅读,-version 选项实际上带有一个选项来选择版本。所有这些事情我直到现在才知道。所以这个问题很好!
  • 嗯。所以有些人说C:\Windows\System32\java.exe 是一个“虚拟”文件,它选择注册表设置并指向它,其他人说它是JRE 安装的实际Java.exe 的副本。一个简单的校验和显示它们不一样(不匹配 32 或 64 位版本)。所以我倾向于一个“假人”,但这并不能解释为什么我会根据我传入的命令行得到不同的版本结果。我不担心 32 位和 64 位,我担心实际版本号差异。谢谢jdv。
  • 您是否尝试使用绝对路径运行这两个选项。虽然我通常同意你的路径上的任何东西都是你路径上的东西,但在这种情况下,有些事情很奇怪。
  • 是的(嗯,不是绝对路径,而是来自每个文件夹,这意味着 Windows 会首先找到那个)。 Program Files 中的所有 32 位和 64 位都按预期运行。奇怪的是C:\windows\system32\java.exe 文件夹和C:\windows\SysWow64\java.exe。他们都做奇数报告。我希望我能弄清楚这一点。 :-)
【解决方案2】:

我尝试重现结果,并且在两个命令上都得到了相同的 java 版本。所以我认为,在您的 Java 文件夹中有多个 JRE 可能会导致结果不一致。

cmd结果

我在 C:\Program Files (x86)\Java 中的 jre

【讨论】:

  • 我所有其他机器也有相同的结果。只是这个很不稳定。我通过移动额外的 JRE/JDK 包来测试你的理论,但问题仍然存在。我想可能是因为 32/64 位的,但问题仍然存在。不过好的想法。谢谢。 :-)
  • @kmort 不要移动额外的 JRE/JDK 包,而是尝试删除它们并检查结果。我希望这行得通。
  • 我不确定这会有什么不同。我的路径没有改变,我将 JRE/JDK 包移出设置的路径。除非有一些我不知道的奇怪机制,否则我的命令行无法解析我移动的包。我错过了什么吗?
猜你喜欢
  • 1970-01-01
  • 2020-10-30
  • 2021-05-09
  • 2012-05-28
  • 1970-01-01
  • 2011-02-04
  • 2014-02-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多