如何修复java.lang.UnsupportedClassVersionError: Unsupported major.minor version错误

1728

我试图使用Notepad++作为我的一站式工具,用于编辑、运行、编译等。

我已经安装了JRE,并设置了我的路径变量为.../bin目录。

当我在Notepad++中运行我的“Hello World”程序时,我收到了这个消息:

java.lang.UnsupportedClassVersionError: test_hello_world :
 Unsupported major.minor version 51.0
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClassCond(Unknown Source)
       .........................................

我认为这里的问题与版本有关;Java的某些版本可能过时或过新。

  1. 我该如何解决这个问题?
  2. 我应该安装JDK,并将路径变量设置为JDK而不是JRE吗?
  3. JREJDK中的PATH变量有什么区别?

是的,我已经这样做了,现在我的路径变量指向jdk所在的位置。 但我仍然遇到了“不支持的次要版本51.0”的错误。 你认为我应该安装旧版本的jdk吗? 我正在使用jdk 1.7.0。 - ERJAN
20
这是我在 Mac OS X 上遇到的问题,由于奇怪的苹果Java6和Oracle Java7混用的情况,导致出现了一些问题。简短地说,使用JDK7编译,使用JDK6运行,就会出现这种情况。 - Warren P
8
在Java中,类名应以大写字母开头。 ;) - Ashish Panery
6
对于El Captain,这个答案解决了我的问题:https://dev59.com/KlsX5IYBdhLWcg3wHshv#34201991 - Taku
你应该升级你的JRE。sudo update-alternatives --config java 命令非常有用。 - Emad Aghaei
显示剩余6条评论
51个回答

2124
所显示的版本号描述了与类文件兼容的JRE版本。
报告的主要数字如下:
Java SE 21 = 65,
Java SE 20 = 64,
Java SE 19 = 63,
Java SE 18 = 62,
Java SE 17 = 61,
Java SE 16 = 60, 
Java SE 15 = 59,
Java SE 14 = 58,
Java SE 13 = 57,
Java SE 12 = 56,
Java SE 11 = 55,
Java SE 10 = 54,
Java SE 9 = 53,
Java SE 8 = 52,
Java SE 7 = 51,
Java SE 6.0 = 50,
Java SE 5.0 = 49,
JDK 1.4 = 48,
JDK 1.3 = 47,
JDK 1.2 = 46,
JDK 1.1 = 45

(来源:维基百科
要解决实际问题,您应该尝试使用更新版本的Java JRE运行Java代码,或者在Java编译器中指定目标参数,以指示编译器创建与早期Java版本兼容的代码。
例如,为了生成与Java 1.4兼容的类文件,请使用以下命令行:
javac -target 1.4 HelloWorld.java

使用更新版本的Java编译器,您可能会收到关于未设置引导类路径的警告。有关此错误的更多信息,请参阅博客文章设置旧源代码而不使用bootclasspath的新javac警告


182
显示的版本号描述了编译代码所使用的Java版本。但实际上并非如此。它显示的是类文件与哪个JRE版本兼容。通过使用交叉编译选项,您可以使用1.7 JDK编译具有1.1(到1.7)类版本的代码。 - Andrew Thompson
8
这是一个很好的解决方案,可以直接从Eclipse编译到先前的版本:https://dev59.com/Fmkv5IYBdhLWcg3wvDXq#16345710 - Alphaaa
20
在Eclipse项目中,依次选择"属性(Proerties)" => "Java编译器(Java Compiler)",将"编译器兼容性级别(the compiler compliance level)"设置为你的JRE或JDK版本所对应的级别。以我自己为例,针对JRE 1.6版本,我选择了1.6作为编译器兼容性级别。 - Sam
6
当编译器源代码与当前编译的JRE/JDK不符时,可能会出现这种情况。例如,我从eclipse.settings文件夹中找到了以下值:org.eclipse.jdt.core.compiler.compliance=1.7,org.eclipse.jdt.core.compiler.source=1.7,org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7。而我的编译器是1.6.0_32。问题在将项目从另一个工作区复制过来并使用JDK 1.7时发生了。更改这些值为1.6后,问题得以解决。 - Gana
如果您正在使用Maven进行编译(以设置maven.compiler.source和maven.compiler.target属性),请使用以下链接:https://maven.apache.org/plugins/maven-compiler-plugin/examples/set-compiler-source-and-target.html - Youness
显示剩余2条评论

407

java.lang.UnsupportedClassVersionError 是因为在编译时使用了较高版本的 JDK,而在运行时使用了较低版本的 JDK 导致的。


3
我该如何进行上述更改? - Ankur Raiyani
11
项目 -> 属性 -> Java编译器启用项目特定设置。然后选择编译器兼容性级别为1.7、1.6或1.5,构建并测试您的应用程序。 - Vivek Kumar Ray
当我转移到Java 7时,不知何故Eclipse仍然试图在Java 6中运行...不知道为什么。卸载旧的JDK对我有帮助。 - Dave
不。在1.1上编译,在1.4上运行。 - nanofarad
9
请使用 sudo update-alternatives --config java 命令来进行操作。 - Thorbjørn Ravn Andersen
显示剩余3条评论

125

在Eclipse中,我只需要转到菜单命令窗口 -> 首选项 -> Java -> 编译器,然后将"编译器兼容性级别"设置为1.6。


3
在 Eclipse 中,有时候项目结构也需要更改以适应相应的 Java 版本。 - Bilal Mirza
6
谢谢。值得注意的是,设置Eclipse的默认执行环境(即构建路径上使用的JRE)是一个单独的设置。我已经设置了JRE但没有设置编译器兼容性级别;这解决了问题。 - wchargin

66

别担心,我已经解决了。

实际上很简单 - 你需要安装相同版本的JRE / JDK。

JRE 6 -> JDK 6

JRE 7 -> JDK 7

依此类推。


31
Java 7也可以毫无问题地处理Java 6。 - damienix

45

这个错误意味着你试图加载一个使用比你安装的Java版本更高的Java“类”文件。

例如,你的.class文件可能是用JDK 7编译的,而你正在尝试在JDK 6上运行它。

所以解决方案要么是:

  • 升级你的Java运行时环境,或者
  • 重新编译类(如果你有源代码),使用你本地的Java编译器。

    javac FileName.java

对于开发人员来说,如果另一个开发人员检入了一个.class文件,并且他们比你拥有一个更新的Java版本,那么就会出现这个问题!


25
你正在尝试使用不支持代码编译版本的Java版本来运行程序。所以基本上你必须使用更高版本编译你的代码,并尝试使用较低版本运行它。
由于此原因,您遇到了
Unsupported major.minor version 51.0

版本 51.0 对应于 J2SE 7。您很可能使用 Java 7 编译了代码,但尝试在低版本中运行它。检查 java -version 显示的版本是否为 Java 7 版本。如果不是,请在 PATH/JAVA_HOME 中进行适当更改。或者您可以使用您正在尝试运行代码的相同版本进行编译。如果配置令您感到困惑,您总是可以提供绝对路径/home/user/jdk1.7.0_11/bin/javac/home/user/jdk1.7.0_11/bin/java


21
我是一个有用的助手,可以为您翻译文本。
我在Mac上遇到了类似的情况,以下过程对我有效:
在终端中输入:
vi ~/.profile

然后在文件中添加这一行,保存。
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk<version>.jdk/Contents/Home

其中版本是您计算机上的版本,例如1.7.0_25

退出编辑器,然后输入以下命令使其生效

source ~/.profile 

然后输入 java -version 检查结果。
java -version 

什么是.profile文件?

.profile文件是一个隐藏文件。当用户登录时,它是一个可选的文件,告诉系统要运行哪些命令。例如,如果我的用户名是bruno,并且在/Users/bruno/中有一个.profile文件,则在登录过程中将执行其所有内容。

来源: http://computers.tutsplus.com/tutorials/speed-up-your-terminal-workflow-with-command-aliases-and-profile--mac-30515


18
在Eclipse菜单中选择Window -> Preferences -> Java -> Compiler,并勾选“配置项目特定设置”。 如果您仍然使用相同Java版本出现错误:尝试手动删除项目的构建文件夹,然后重新启动Eclipse。

15

您可以有一些在Java 7中编译的JAR库,但您只有Java 6作为Java Runtime。这可能会发生在一些新的库。


14

最常见的问题是您的JAVA_HOME变量配置不正确,它应该指向正确的Java开发工具包库(如果您安装了多个版本)。

要查找SDK Java文件夹的位置,请运行以下命令:

jrunscript -e 'java.lang.System.out.println(java.lang.System.getProperty("java.home"));'

Debian/Ubuntu

要检查已安装的Java(OpenJDK)版本,请执行以下命令:

dpkg -l "openjdk*" | grep ^i
或者:
update-java-alternatives -l

要更改它,请使用:

update-alternatives --config java
如果需要,使用sudo前缀。

选择备选的Java版本。

或者查看可安装的版本:

apt-cache search ^openjdk

如果需要,请在前缀中添加sudo

然后,您可以安装如下示例:

apt-get install openjdk-7-jre

如果需要,使用sudo前缀。

Fedora、Oracle Linux和Red Hat

通过以下方式安装/升级适当的软件包:

yum install java-1.7.0-openjdk java-1.7.0-openjdk-devel

java-1.7.0-openjdk包只包含Java运行环境。如果你想开发Java程序,请安装java-1.7.0-openjdk-devel包。

BSD

在FreeBSD Ports集合中有一个名为openjdk7的OpenJDK 7包,可能需要重新配置。

请参见:OpenJDK维基页面

Windows

只需从Oracle网站安装适当的Java SE开发套件库或安装

Jenkins

如果您在Jenkins中遇到此问题,请参见:

但是使用update-alternatives选择正确的Java版本(较新的版本)应该可以解决问题。


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