问题
我的开发团队最近被迫转到我们无法完全访问服务器的远程开发环境。在转换之前,我们有一个JAR在Java 1.7 x64和JRE 7上正常运行。当我们移动到新服务器时,我们的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%变量和系统路径中都有JDK 1.7和JRE 7。我甚至重新安装了JRE 6并将其放在系统环境PATH变量中,结果相同。
我还更改了注册表以查看1.6,它导致以下内容,我查找了它,似乎是安装了多个Javas(导致我原来的问题):
Exception in thread "main" java.lang.UnsupportedClassVersionError: ... :
Unsupported major.minor version 51.0
我很感激你们所有的见解,因为我一直在寻找各种论坛,但似乎没有任何问题。此外,这也发生在我们正在使用的另一台服务器上。谢谢!
更新:没有运气将JAR重新编译为1.6或1.7并匹配JDK。另外,为什么世界上新版本的Java会破坏旧的编译版本呢?
#1 热门回答(155 赞)
当你以某种方式混淆java本身时会发生这种情你正在尝试运行它找到JRE 7的java 6 VM。即使你在错误配置的环境中键入命令行justjava或java -version,它也可能显示此问题。 JAR不是问题所在,除非在JAR中的代码在Windows注册表中查找(这可能不是你的情况)的非常不可能的情况。
在我的情况下,我在Windows/System32文件夹中获得了Java 6的java.exe,javaw.exe和javaws.exe(不知道它是如何存在的)。 JDK和JRE的其余部分位于PATH insideC:\Java\jdk_1.7.0\bin中。哎呀!
#2 热门回答(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系统目录。除非被新的8级安装覆盖,否则这些仍然存在。
但是,Java 8安装程序会在新目录C:\ ProgramData \ Oracle \ Java \ javapath中创建符号链接,指向实际的JRE 8位置。
这意味着你实际上将运行旧的7个exes但使用新的8个DLL。
因此,解决方案只是从Windows系统目录中删除3个Java exes,如上所述。
如果你在64位Windows上运行32位Java,那么exes将位于Windows \ SysWOW64中,否则将位于Windows \ System32中。
#3 热门回答(27 赞)
我在windows / system32上删除了java文件,我也从PATH变量中删除了c:\ ProgramData \ Oracle \ Java \ javapath,因为java 1.8文件有3个符号链接。
我在%JAVA_HOME%变量中使用了JDK 1.7,在PATH中使用了java1.7 / bin。
PS1:我的问题出在Java 1.7和Java 1.8之间。
PS2:我不能将此作为对Victor的答案的评论,因为我没有足够的分数。