注册表项“...”具有值“1.7”,但需要“1.6”。Java 1.7 已安装,注册表指向它

2022-08-31 10:44:58

我的开发团队最近被迫进入远程开发环境,在那里我们没有对服务器的完全访问权限。在转换之前,我们有一个JAR在Java 1.7 x64和JRE 7上运行良好。当我们移动到新服务器时,我们的JAR运行正常,但是后来其中一个服务器管理员将我们的Java“更新”到旧版本并卸载了我们正在使用的Java。不要问我为什么,我不知道。我重新安装了Java 1.7并卸载了1.6以及JRE。

运行时会出现以下问题,没有生成错误:

Registry key 'Software\JavaSoft\Java Runtime Environment\CurrentVersion'
has value '1.7', but '1.6' is required.
Error: could not find java.dll
Error: could not find Java SE Runtime Environment.

我在笔记本电脑上运行了相同的JAR,没有任何问题。服务器和我的笔记本电脑在各自的 %HOME% 变量和系统 PATH 中都有 JDK 1.7 和 JRE 7。我甚至重新安装了JRE 6,并将其放置在系统环境PATH变量中,结果相同。

我还将注册表更改回1.6,结果如下,我查找了该结果,它似乎来自安装了多个Java(导致我的原始问题):

Exception in thread "main" java.lang.UnsupportedClassVersionError: ... :
Unsupported major.minor version 51.0

我很感激你们所有人的任何见解,因为我一直在查看各种论坛,但似乎没有什么是我的问题。此外,这也发生在我们正在使用的另一台服务器上。谢谢!

更新:将JAR重新编译为1.6或1.7并匹配JDK没有运气。另外,为什么新版本的Java会破坏旧的编译版本呢?


答案 1

当你以某种方式混淆java本身时,就会发生这种情况。您正在尝试运行一个 java 6 VM,它找到了一个 JRE 7。即使您只是在命令行中键入或在配置错误的环境中键入,它也可能显示此问题。JAR不是问题,除非在极不可能的情况下,JAR中的代码在Windows注册表中查找该代码(这可能不是您的情况)。javajava -version

在我的情况下,我在文件夹中有,并且来自Java 6(不知道它是如何到达那里的)。其余的JDK和JRE在PATH内部找到。哎呀!java.exejavaw.exejavaws.exeWindows/System32C:\Java\jdk_1.7.0\bin


答案 2

在已经运行Java 7的系统上安装java 8(jdk&jre)时,遇到了类似的错误。

错误:注册表项“软件\JavaSoft\Java 运行时”

环境“\当前版本”的值为“1.8”,但“1.7”是必需的。

错误:找不到 java.dll 错误:找不到 Java SE 运行时环境。

我的环境设置正确(Path &java_home正确定义),但问题源于8年之前的Java安装程序的工作方式,即他们曾经将三个可执行文件(java.exe,javaw.exe和javaws.exe)复制到Windows系统目录。除非被新的 pre-8 安装覆盖,否则这些将保持不变。

但是,Java 8 安装程序会在新目录 C:\ProgramData\Oracle\Java\javapath 中创建符号链接,指向实际的 JRE 8 位置。

这意味着您实际上将运行旧的 7 个 exe,但使用新的 8 个 DLL。

因此,解决方案是简单地从Windows系统目录中删除3个Java exes,如上所述。

如果您在 64 位 Windows 上运行 32 位 Java,则 exe 将位于 Windows\SysWOW64 中,否则位于 Windows\System32 中。


推荐