注册表键“...”的值为“1.7”,但需要“1.6”。Java 1.7已安装且注册表指向它。

96

我的开发团队最近被迫使用远程开发环境,我们无法完全访问服务器。在更改之前,我们有一个JAR文件,在Java 1.7 x64和JRE 7上运行良好。当我们转移到新服务器时,我们的JAR文件一开始是可以运行的,但是其中一个服务器管理员“更新”了我们的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没有问题。服务器和我的笔记本电脑都使用JDK 1.7和JRE 7在各自的%HOME%变量和系统PATH中。我甚至重新安装了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会破坏旧版本编译的程序呢?

10个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
160

当你混淆了Java本身时,就会出现这种情况。你试图运行Java 6虚拟机,却发现有一个JRE 7。即使在命令行中只输入 javajava -version,也可能出现这个问题,因为环境配置错误。JAR不是问题,除非在JAR中的代码正在Windows注册表中寻找它(这很可能不是你的情况)。

在我的情况下,我将Java 6的 java.exejavaw.exejavaws.exe 放在了 Windows/System32 文件夹中(不知道它是怎么到那里的)。其余的JDK和JRE在 C:\Java\jdk_1.7.0\bin 路径内被发现。哎呀!


64
在卸载Java 8之后,我遇到了同样的问题。通过删除Windows/System32中存在的java.exe、javaw.exe和javaws.exe文件来解决问题。真的很奇怪,因为我甚至不知道它们是怎么出现的。 - C Deepak
2
谢谢通知,这很有帮助。在我的情况下,JDK 1.7和JDK 1.8之间有什么区别。 - daoway
7
针对 x86 的用户注意啦!我几个月前安装了 1.8 版本的 jre,并且想要安装 1.8 版本的 sdk。可是,java.exejavaw.exejavaws.exe 这三个文件被存储在 Windows/SysWOW64 目录下。后来,我安装了 1.8 版本的 sdk,但是它会在 C:/ProgramData/Oracle/Java/javapath 路径下再次安装 java.exejavaw.exejavaws.exe 这三个文件。不知道为什么,但我把它们也删除了,现在 java -version 命令依然有效。 - Luminous
2
删除Windows/System32中存在的java.exe、javaw.exe和javaws.exe可以解决我的问题。感谢@C Deepak。 - Tahir Jilani
1
@notsodev 非常好。我自己也遇到了这个问题,经过识别原因并解决它(通过删除system32上的错误文件),我决定提供反馈并发布这个答案。当时我不知道这个问题如此频繁地影响着很多人! :) - Victor Stafusa - BozoNaCadeia
显示剩余3条评论

59

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

错误:注册表键'Software\JavaSoft\Java Runtime Environment'\CurrentVersion'的值为“1.8”,但需要“1.7”。

错误:找不到java.dll。错误:找不到Java SE Runtime Environment。

我的环境设置正确(路径和java_home正确定义),但问题出现在早期版本的Java安装程序工作方式上,它们会复制三个可执行文件(java.exe、javaw.exe和javaws.exe)到Windows系统目录中。这些文件除非被新的早期版本安装覆盖,否则会一直存在。

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

这意味着您实际上会运行旧的7 exes,但使用新的8 DLLs。

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

如果您在64位Windows上运行32位Java,则这些可执行文件将位于Windows\SysWOW64中,否则位于Windows\System32中。


这是一个可行的解决方案,我曾经遇到过同样的问题,而这个方法解决了它。 - Sagar D
这是一个更好的解决方案...至少对我来说是。谢谢。 - cbmeeks

28

我已经在windows/system32目录下删除了Java文件,并从PATH变量中删除了c:\ProgramData\Oracle\Java\javapath,因为有3个符号链接指向Java 1.8文件。

我在%JAVA_HOME%变量中设置的是JDK 1.7,在PATH中设置了java1.7/bin。

PS1:我的问题出在Java 1.7和Java 1.8之间。

PS2:我不能将此添加为对Victor答案的评论,因为我没有足够的积分。


3
问题:我在尝试使用 Sencha Cmd 时遇到了 1.7 和 1.8 的问题。解决方案:我在 %PATH% 环境变量中添加了 jdk1.7/bin 路径,并从 c:/windows/system32 目录中删除了 java 文件 (java.exe、javaw.exe、javaws.exe)。问题得到解决 :) - saurabh
3
整个问题都出在 X:\Windows\SysWOW64 和 X:\Windows\System32 目录下的 java*.exe 文件上。一旦删除这些文件,一切就恢复正常了。 - thiagoh

17
在“开始”菜单中键入“regedit”以打开注册表编辑器。 在左侧的注册表浏览器/树菜单上找到“HKEY_LOCAL_MACHINE”。 在“HKEY_LOCAL_MACHINE”注册表中点击“SOFTWARE”。 在“SOFTWARE”注册表中点击“JavaSoft”。 在“JavaSoft”列表中点击“Java Runtime Environment”,这里可以看到已安装的不同版本的Java。 点击“Java Runtime Environment”-右侧您将获得4-5行。请选择“CurrentVersion”并右键单击(选择修改选项)将版本更改为“1.7”。 现在魔法已经完成。

4
我不知道是否还有人关注这个帖子,但我最近在尝试将ActiveMQ 5.10作为Windows服务启动时遇到了这个问题。 我没有设置JAVA_HOME路径。我安装了Java 6和Java 7,但默认版本是v7(即如果我打开命令窗口并键入“ java-version”)。 这就是线索所在——“java-version”返回“Java HotSpot(TM) 64-Bit Server VM (build 23.1-b03, mixed mode)”,但我已经安装了Win32服务... 事实证明,如果您在64位机器上使用Win32包装器,它会以某种方式决定使用不同版本的Java... 因此,我的解决方法是卸载32位版本的包装器并安装64位版本。这可能只是我的习惯,但幸运的是我最终解决了这个问题...

1
如果您安装了32位和64位Java版本,并且自动更新(或在我这种情况下是强制企业更新)只更新其中一个,则可能会遇到此问题。卸载所有Java实例并重新安装32位和64位版本即可解决。 - DannyMeister

0

针对我的Win7系统

问题出在System32文件夹中的java.exe和javaw.exe。打开该文件夹,我无法看到它们,但是使用开始菜单中的搜索功能,我找到了这些文件的链接,并将其删除。接下来的搜索结果给出了JAVA_HOME中的文件链接。

神奇的解决方法)


-1

切换到正确的java.exe目录,即进入所需的JDK版本java.exe目录。

cd C:/Program Files/Java/jdk1.7.0_25/bin

从此目录运行java.exe,它优先于注册表和$PATH设置。

java -jar C:/installed/selenium-server-standalone-2.53.0.jar 

-2

我通过卸载Java 1.8解决了这个问题。


-3

使用 regedit,删除与 Java 7 相应的条目。这样就可以正常工作了。


-3
这个 jar 包是用 1.6 编译的。这就是为什么会出现这个错误。有两种解决方法:
1)使用 Java 1.6

OR

2)重新编译 jar 包以符合你的环境标准 1.7


我实际上已经做了这两个,但让我稍微回顾一下。JAR实际上是通过C# GUI运行的。JAR本身是通过命令行运行的,但不是通过GUI运行的。我认为可能是我正在运行的JAR中的另一个JAR(与运行GUI有关)。那么这可能是情况吗?嵌套的JAR文件被编译为1.6? - notsodev
这听起来不可信。Java 版本向下兼容;为 JDK 6 编译的代码将在 Java 7 上运行,无需重新编译或修改。 - Jesper
@Jesper 我可能把这个问题和我在Eclipse中经常看到的类似问题混淆了。 - Woot4Moo
1
@ Jesper,这就是为什么这一切对我来说都没有意义的原因。我发现的所有内容都与在旧版本的Java(如1.6)上运行的新版本JAR有关,并且使用了1.5 JRE。但是这个问题似乎是相反的。 - notsodev

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