96

我的开发团队最近被迫转移到一个远程开发环境,我们无法完全访问服务器。在更改之前,我们有一个在 Java 1.7 x64 和 JRE 7 上运行良好的 JAR。当我们转移到新服务器时,我们的 JAR 运行良好,但随后其中一位服务器管理员“更新”了我们的 Java 到旧版本版本并卸载了我们正在使用的版本。不要问我为什么,我不知道。我重新安装了 Java 1.7 并连同 JRE 一起卸载了 1.6。

运行时出现以下问题,没有构建错误:

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 会破坏旧的编译版本?

4

10 回答 10

160

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

就我而言,我在文件夹中有来自 Java 6的java.exe,javaw.exe和(不知道它是如何出现的)。JDK 和 JRE 的其余部分在 PATH 里面找到。哎呀!javaws.exeWindows/System32C:\Java\jdk_1.7.0\bin

于 2013-09-21T01:54:21.603 回答
59

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

错误:注册表项 'Software\JavaSoft\Java Runtime

Environment'\CurrentVersion' 的值为 '1.8',但需要 '1.7'。

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

我的环境设置正确(正确定义了路径和 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 exe,如上所述。

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

于 2015-01-03T15:37:09.660 回答
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:我无法将此作为评论添加到维克多的回答中,因为我没有足够的积分。

于 2014-09-22T17:18:33.633 回答
17

在开始菜单中输入“regedit”打开注册表编辑器

转到左侧注册表资源管理器/树菜单上的“HKEY_LOCAL_MACHINE”

单击“HKEY_LOCAL_MACHINE”注册表中的“软件”

单击“软件”注册表中的“JavaSoft”

单击“JavaSoft”注册表列表中的“Java Runtime Environment”,您可以看到已安装的不同版本的java

单击“Java 运行时环境”- 在右侧,您将获得 4-5 行。请选择“CurrentVersion”并右键单击(选择修改选项)将版本更改为“1.7”

现在魔法已经完成

于 2015-05-12T09:36:29.900 回答
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 位版本。厌恶我的机器;我猜只是习惯......但幸运的是我最终解决了这个问题......

于 2014-07-24T07:36:54.657 回答
0

对于我的 Win7

悖论在于 System32 文件夹中的 java.exe 和 javaw.exe。打开那个文件夹我看不到它们,但是在开始菜单中使用搜索我得到了这些文件的链接,删除了它们。Next searsh 给了我指向 JAVA_HOME 文件的链接

魔法 )

于 2015-02-04T21:04:48.177 回答
-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 
于 2016-05-09T10:51:36.927 回答
-2

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

于 2015-05-10T20:00:16.750 回答
-3

使用 regedit,删除对应于 java 7 的条目。它将起作用。

于 2014-07-31T13:45:06.437 回答
-3

jar 被编译为1.6 兼容的。这就是您收到此错误的原因。两个解决方案:
1) 使用 Java 1.6

或者

2)重新编译jar以符合您的环境1.7

于 2013-03-07T17:14:51.763 回答