如何修复java.lang.UnsupportedClassVersionError:不支持的major.minor版本

How to fix java.lang.UnsupportedClassVersionError: Unsupported major.minor version

提问人:ERJAN 提问时间:4/30/2012 最后编辑:HearenERJAN 更新时间:8/21/2023 访问量:2261529

问:

我正在尝试使用 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. JRE 和 JDK 中的变量有什么区别?PATH
Java JVM 不兼容 unsupported-class-version

评论

0赞 CyprUS 4/30/2012
你也安装了JDK吗?jre是Java运行环境,要创建java应用,还需要jdk
0赞 ERJAN 5/1/2012
是的,我做到了,现在我的路径变量指向 JDK 所在的位置。但是我仍然有这个“不支持的次要版本 51.0”错误,您认为我应该安装旧版本的JDK吗?我正在使用 JDK 1.7.0
20赞 Warren P 10/7/2013
这在Mac OS X上发生在我身上,当时由于这些天OSX上奇怪的Apple java 6和Oracle java 7情况而遇到问题。短版本:用JDK7编译,用JDK6运行,得到这个。
8赞 Ashish Panery 2/4/2014
在 java 中,ClassName 应以大写字母开头;)
6赞 Taku 1/24/2016
对于 El Captain,这个答案为我解决了这个问题:stackoverflow.com/a/34201991/1615594

答:

66赞 ERJAN 5/4/2012 #1

别担心,我已经解决了。

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

JRE 6 -> JDK 6

JRE 7 -> JDK 7

等等。

评论

31赞 damienix 10/31/2013
Java 7 也可以毫无问题地处理 6。
408赞 Vivek Kumar Ray 6/28/2012 #2

java.lang.UnsupportedClassVersionError发生这种情况是因为编译时的 JDK 较高,而运行时的 JDK 较低。

评论

3赞 Ankur Raiyani 8/14/2013
我怎样才能进行上述更改?
11赞 Vivek Kumar Ray 8/16/2013
项目 -> 属性 -> Java 编译器 启用特定于项目的设置。然后选择“编译器符合性级别”到 1.7、1.6 或 1.5,生成并测试应用。
0赞 Dave 8/19/2013
当我迁移到 Java 7 时,不知何故,Eclipse 一直试图在 Java 6 中运行......不知道为什么。卸载旧的 JDK 为我解决了问题。
0赞 nanofarad 9/10/2013
不。在 7 上编译 1.1,在 1.4 上运行。
9赞 Thorbjørn Ravn Andersen 1/29/2014
@ezdazuzena习惯这样做。sudo update-alternatives --config java
2127赞 Juha Palomäki 7/11/2012 #3

显示的版本号描述了类文件与之兼容的 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 编译器,您可能会收到有关未设置引导程序类路径的警告。有关此错误的更多信息,请参阅博客文章 New javac warning for setting an older source without bootclasspath

评论

182赞 Andrew Thompson 1/10/2013
“如果使用 Java 编译代码,则显示的版本号描述了哪个版本。” 不,它没有。它显示类文件与之兼容的 JRE 版本。使用交叉编译选项,可以使用 1.7 JDK 编译具有 1.1(到 1.7)的类版本的代码。
8赞 Alphaaa 5/23/2013
这是直接从Eclipse编译到以前版本的一个很好的解决方案:stackoverflow.com/a/16345710/2091700
20赞 Sam 9/25/2013
IN eclipse project=>Proerties=>java 编译器;将“编译器合规性级别”设置为符合 JRE 或 JDK 的版本。至于我,jre 1.6 是 1.6
6赞 Gana 12/22/2014
当编译器源代码设置与当前编译的 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。将值更改为 1.6 后,问题已解决。该问题起源于我从使用 JDK 1.7 :(的不同工作区复制项目后
0赞 Kimchi Man 1/28/2017
在 eclipse 上,右键单击项目 -> 单击属性 ->单击左侧面板上的 Java 构建路径 -> 单击“库”选项卡 ->将“JRE 系统库”更改为正确的版本
45赞 Brad Parks 2/21/2013 #4

此错误意味着您正在尝试加载使用比您安装的更新版本的 Java 编译的 Java“类”文件。

例如,您的文件可能已针对 JDK 7 进行了编译,而您正在尝试使用 JDK 6 运行它。.class

因此,解决方案是:

  • 升级 Java 运行时或
  • 如果您有源代码,请使用本地 Java 编译器(如果有的话)重新编译该类。

    javac 文件名:.java

对于开发人员来说,如果另一个开发人员签入了 .class 文件,并且他们拥有比您更新的 java 版本,就会发生这种情况!

125赞 Cacovsky 5/3/2013 #5

在Eclipse中,我只是转到菜单命令Window -> Preferences -> Java -> Compiler,然后将“Compiler compliance level”设置为1.6。

评论

3赞 Bilal Mirza 7/4/2013
在 eclipse 中,有时还需要将项目方面更改为适当的 java 版本。
6赞 wchargin 1/26/2014
谢谢。值得注意的是,设置 Eclipse 的默认执行环境(构建路径上的 JRE)是一个单独的设置。我设置了 JRE,但没有设置编译器合规性级别;这修复了它。
15赞 Rio 6/25/2013 #6

您可以在 Java 7 中编译一些 JAR 库,并且只有 Java 6 作为 Java 运行时。它可能会发生在一些新库中。

18赞 Andreas L. 8/6/2013 #7

在 Eclipse 的菜单 Window -> Preferences -> Java -> Compiler 中,还要选中 “Configure Project Specific Settings”。

如果您遇到相同 Java 版本的错误:尝试手动删除项目的构建文件夹。然后重新启动 Eclipse。

11赞 Mace Ojala 9/17/2013 #8

正如一些人在其他地方回答的那样,Java 程序运行在比它编译它的版本更旧的 Java 版本上。它需要“交叉编译”以实现向后兼容性。换句话说,源 Java 版本和目标 Java 版本之间存在不匹配。

更改 Eclipse 菜单中的选项并不能回答原始发帖人,他说他/她没有使用 Eclipse。在 OpenJDK javac 版本 1.7 上,如果使用 参数 和 ,则可以交叉编译 1.6,并在编译时提供目标版本(即旧版本)的 rt.jar -file。如果你真的安装了 1.6 JRE,你可以指向它的安装(例如,Ubuntu 上的 /usr/lib/jvm/java-6-openjdk-i386/jre/lib/rt.jar 显然是 SunOS 上的 /usr/jdk/jdk1.6.0_60/jre/lib/rt.jar。对不起,我不知道它在 Windows 系统上的位置)。这样:-source-target

javac -source 1.6 -target 1.6 -bootclasspath /usr/lib/jvm/java-6-openjdk-i386/jre/lib/rt.jar HelloWorld.java

看起来你可以从互联网上下载rt.jar,并指向它。不过,这并不算太优雅:

javac -source 1.6 -target 1.6 -bootclasspath ./rt.jar HelloWorld.java
25赞 Aniket Thakur 10/1/2013 #9

您正在尝试使用不支持编译代码的版本的 Java 版本运行程序。因此,基本上您必须使用较高版本编译代码并尝试使用较低版本运行它。

当你得到

Unsupported major.minor version 51.0

版本 51.0 对应于 J2SE 7,您很可能已经在 Java 7 中编译了代码并尝试使用较低版本运行它。检查显示的内容。它应该是 Java 7 版本。如果没有,请在 PATH/JAVA_HOME 中进行适当的更改。或者,您可以使用尝试运行代码的相同版本进行编译。如果配置令人困惑,您始终可以给出绝对路径和 。java -version/home/user/jdk1.7.0_11/bin/javac/home/user/jdk1.7.0_11/bin/java

12赞 Mandar Pandit 10/14/2013 #10

当我使用 Ant 脚本构建我的应用程序时,我遇到了同样的问题。

我使用 Eclipse 进行应用程序开发,并在项目的构建属性中更改了编译器版本。但这对我不起作用。然后我发现我可以在 Ant 脚本中提供编译器版本。

我在编译 Java 文件的部分修改了 Ant 脚本。

<target name="build-java" depends="prepare-build">
    <echo message="Compiling java files"/>
    <javac ....
           target="1.5"...
    </javac>
</target>

这对我解决了不受支持的主要次要问题很有效。

12赞 user3168034 1/7/2014 #11

当我安装 JDK 1.7 时,问题得到了解决。

22赞 Tony 2/11/2014 #12

我在Mac上遇到了类似的情况,以下过程对我有用:

在终端中,键入

vi ~/.profile

然后在文件中添加此行,并保存

export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk<version>.jdk/Contents/Home

其中 version 是计算机上的版本,例如 。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

8赞 ckielstra 2/11/2014 #13

从 Eclipse 运行 Ant 时,我遇到了相同的错误消息,但这里提到的其他解决方案并没有解决我的问题。有趣的是,从 Windows 命令行运行 Ant 运行良好,因此它一定是 Eclipse 中的配置问题。

事实证明,在 Eclipse 下,您可以指定 Ant 应该运行的环境,并将其设置为 JRE 而不是 JDK。

  • 转到: 运行 -> 外部工具 ->外部工具配置...
  • 为您的项目选择 Ant build.xml(如果您有多个项目)
  • 激活选项卡“JRE”
  • 这里选择了“单独的 JRE:jre6”。当我将其更改为 1.6 或 1.7 系列的 JDK 时,错误消失了。
10赞 Thamme Gowda 3/10/2014 #14

如果您在使用 Maven 时遇到此问题,可以使用插件 Maven Compiler 编译代码。

 <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                </configuration>
            </plugin>
       .....

UPDATE:如果使用的是 JDK 8,请将 和 设置为 。sourcetarget1.8

评论

0赞 coding_idiot 11/1/2014
关于如何使用插件进行交叉编译的片段将非常好,而不是访问/打开链接
4赞 Creative_Cimmons 3/20/2014 #15

首先,让我们了解一些基础知识......

JRE 是 NetBeans/Eclipse/standalone 中的一个组件,它将为您提供库、JVM、Java 插件和 Java Web Start。请注意,它不提供编译器或调试器。

JDK 是 JRE 的超集,以及编译器和调试器。

因此,当您将默认库作为 JRE 而不是 JDK 时,您将在导入内容时度过一段愉快的时光,但它不会编译。

相反,请将路径设置为 JDK(我使用 NetBeans,并使用 netbeans/etc/netbeans.conf 中的 netbeans.conf 设置路径并更改路径)。

6赞 oraclesoon 4/8/2014 #16

今天,这个错误消息出现在我们的 Tomcat 7 on Ubuntu 12.04.2 LTS (Precise Pangolin) 中:

/var/log/tomcat7/localhost.2014-04-08.log:
2014 年 4 月 8 日上午 9:00:55 org.apache.catalina.core.StandardContext filterStart
SEVERE:异常启动过滤器 struts2
java.lang.UnsupportedClassVersionError: controller/ReqAccept:不支持的 major.minor 版本 51.0(无法加载类控制器。ReqAccept)

Struts 应用程序是使用 Java 7 编译的。

原来,有人用“service tomcat [stop/start]”重启Tomcat 7,

$ ps -ef |grep java
tomcat7 31783 1 32 20:13 ?00:00:03 /usr/lib/jvm/default-java/bin/java...
$ /usr/lib/jvm/default-java/bin/java -version
java 版本 “1.6.0_27”

这会导致“不支持的 major.minor 版本 51.0”错误。

当我们使用“/etc/init.d/tomcat7 [stop/start]”重新启动 Tomcat 7 时,问题就解决了。

$ ps -ef |grep java
tomcat7 31886 1 80 20:24 ?00:00:10 /usr/local/java/jdk1.7.0_15/bin/java
$ /usr/local/java/jdk1.7.0_15/bin/java -version
java 版本“1.7.0_15”

6赞 user3534268 4/15/2014 #17

当我恢复到 Java 6 并尝试运行以前使用 Java 7 编译的类时遇到了这个问题。对我有用的是 java >编译器>首选项——>将合规性级别设置为 1.6,并且至关重要的是“配置项目设置”。

11赞 Adit Ya 5/28/2014 #18

基于此...

J2SE 8 = 52
J2SE 7 = 51
J2SE 6.0 = 50
J2SE 5.0 = 49
JDK 1.4 = 48
JDK 1.3 = 47
JDK 1.2 = 46
JDK 1.1 = 45

在 Eclipse 中,右键单击包资源管理器中的项目:

Build Path -> 配置构建路径

下:

Java 构建路径 -> 库 -> 添加库 -> JRE 系统 -> 已安装的 JRE -> 搜索

通过在搜索完成后的可用列表中选择库来添加所需的 JRE。

3赞 Matthew Wise 6/19/2014 #19

我遇到了一个问题,我必须从命令行在我的项目上运行 Maven 编译才能运行我的单元测试;如果我对测试类进行了更改并让 Eclipse 自动重新编译它,那么我得到了“不支持的 major.minor 版本 51.0”错误。

我确实安装了 JDK6 和 JDK7,但我所有的 JRE 设置都指向 1.6,无论是在 pom 中还是在 Eclipse 中的项目属性页面中。再多的 Maven 更新项目和/或刷新也无法解决这个问题。

最后,我尝试关闭项目并重新打开它,这似乎解决了它!HTH

3赞 Sagar Varpe 6/26/2014 #20

您已经使用 JDK 7 编译了 Java 类,并且正在尝试在 JDK 6 上运行相同的类。

3赞 siddmuk2005 8/4/2014 #21
  • 安装 JDK 7.0.55 并将 Java for Eclipse 设置为 JDK 7.0.55。
  • 通过在生成路径 JDK 7.0.55 上配置,使用 JDK 7.0.55 生成项目。
  • 在 Eclipse for JDK 7.0.55 中,通过菜单设置编译器:Windows -> Preferences -> Java -> Compiler - select 1.7。
6赞 Siddharth 8/22/2014 #22

我解决了。我跑了:

JAVA_HOME=/usr/lib/jvm/java-7-openjdk-i386

该错误具有误导性。这给人的印象是不支持版本 51 (Java 7)。我们应该使用 Java 6。Unsupported major.minor version 51.0

错误应该是:

不支持当前的 Java 版本 50。请改用 Java 版本 7(51:0 及更高版本)。

13赞 Ben 9/1/2014 #23

我在用 1.7 编写的项目中遇到了同样的问题,并尝试在 1.6 中执行。

我在Eclipse中的解决方案:

  • 右键单击您的项目属性 -> Java 构建路径 -> 库

  • 选择您的 JRE 系统库,然后单击右侧的编辑,然后选择目标 JRE。

  • 现在转到左侧的 Java Compiler,并将 Compiler 合规性级别更改为您的目标。

这对我有用。

评论

0赞 Ravi 3/22/2022
你告诉解决方案非常简单。它对我有用.伟大。非常感谢。对于每个项目,我们需要一次又一次地进行相同的设置。有没有永久的解决方案??
8赞 L Lawliet 9/24/2014 #24

您已使用较高版本的 JDK 进行编译,并尝试从较低版本的 JDK/JRE 运行。

要检查这一点,请参阅版本信息:

javac -version

java -version

它们将有所不同,javac 将具有更高的版本号。

要解决此问题,请使用 JDK 版本的 java 运行,或者如果您有更新的 JRE/JDK 也可以运行。

which javac会告诉你位置,例如,.只需直接使用 ./usr/bin/javac/usr/bin/java <program>

或者,您可以将环境变量设置为永久解决方案。

8赞 Vihung 3/26/2015 #25

我该如何解决?

此错误意味着用于执行类代码的 JRE 无法识别所使用的 Java 版本。通常是因为生成类文件(即编译它)的 Java 版本较新。

要修复它,您可以

a) 使用与运行 Java 编译器相同或较旧版本的 Java 编译器编译 Java 源代码。即安装适当的 JDK。

b) 使用较新版本的 Java 编译器编译 Java 源代码,但处于兼容模式。即使用参数。-target

c) 在与用于编译类的 JDK 相同或更新版本的 JRE 中运行已编译的类。

您可以检查当前用于编译器和运行时的版本。javac -versionjava -version

我是否应该安装 JDK,并将我的 PATH 变量设置为 JDK 而不是 JRE?

对于编译,当然,安装并配置所需的特定 JDK。

对于运行时,您可以使用 JDK 或独立 JRE 附带的版本,但无论如何,请确保您安装了正确的版本,并且您已经配置了 PATH,以便不会出现意外。

JRE 和 JDK 中的 PATH 变量有什么区别?

PATH 环境变量告诉命令 shell 在何处查找您键入的命令。键入 时,命令 shell 解释器将从左到右查看变量中指定的所有位置,以找到要运行的相应运行时可执行文件。如果您安装了多个版本的 Java,即您在 PATH 变量中指定的多个位置安装了可执行文件,那么从左到右时遇到的第一个版本将是执行的版本。javaPATHjavajava

编译器命令是且仅随 JDK 一起提供的。runtime 命令是 JDK 附带的,位于 JRE 中。javacjava

您可能安装了一个版本 (51.0 = Java 7),并且您也安装了相同版本的版本,但是另一个以前的版本出现在 PATH 的前面,因此正在被调用,而不是您期望的版本。javacjavajava

14赞 kenorb 4/4/2015 #26

最常见的问题是变量配置错误,如果安装了多个变量,则该变量应指向正确的 Java 开发工具包库。JAVA_HOME

若要查找 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 运行时环境。如果要开发 Java 程序,请安装软件包。java-1.7.0-openjdkjava-1.7.0-openjdk-devel

BSD的

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

请参阅:OpenJDK wiki 页面

窗户

只需从 Oracle 站点安装相应的 Java SE 开发工具包库或安装

詹金斯

如果在使用 Jenkins 时遇到此问题,请参阅:

但是,选择正确的 Java 版本(更新)应该可以工作。update-alternatives

5赞 TomTom 4/9/2015 #27

哦,Mac OS X,我能够通过设置JAVA_HOME变量来解决这个问题:

export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home
10赞 ethemsulan 11/3/2015 #28
  • 如果使用 Maven,请设置 Java 编译级别。打开命令行并编写编译级别:java -version

    Enter image description here

  • 如果使用 IntelliJ IDEA,请选择“项目”→“文件设置→“生成执行部署→编译器”→“Java 编译器”。 然后将字节码更改为 1.7,如下图所示:

    Enter image description here

评论

0赞 Joe Borysko 9/23/2016
更换 pom 后,我还需要进行 maven 全新安装。
6赞 Manohar 9/14/2016 #29

您的 Java 文件使用与您尝试运行它的版本(较低的运行时版本)不同的版本(更高的编译器版本)进行编译。

基本的理解是,使用较低版本编译的类应在以后的较高版本中运行。但相反(使用较高的编译器版本编译并尝试使用较低的运行时版本运行它)有时是完全不可能的。

因此,在尝试执行程序时,您会看到此错误。不支持的 major.minor 版本 x.x

问:我已经在 Java 7 中创建了一个应用程序,但是当我的用户尝试 运行它,他们会收到不支持的 major.minor 版本 51.0 错误。什么 这是否意味着什么,我能做些什么?

一个:如果在 Java 7 中使用 javac 编译应用程序,那么生成的类文件将具有 51.0 版本号。的版本 Java 7 之前不识别此编号,因此您的用户将拥有 在运行应用程序之前升级到 Java 7。如果你不是 使用任何 Java 7 API,您可以尝试使用 javac -target 1.6 创建与 1.6 兼容的类文件。如果您的 应用程序是使用 WebStart 部署的,您可以指定最小值 需要版本。有关更多信息,请参阅有关 Java Web Start 的文档 和 JNLP 在这里。一旦我们触发自动更新,这个问题就会消失 Java 7 适用于当前桌面上有 Java 6 的最终用户。这 这个时间表还没有确定,我们想给开发者 是时候先解决他们的代码和 JDK 7 之间的任何问题了。

(来源:oracle.com

4赞 Mike-Bell 3/6/2018 #30

就我而言,问题出在服务器运行时配置中:

Server Runtime Environment

检查 JRE 是否是您需要的版本:

enter image description here

该项目在 1.7 版本中,服务器 JRE 设置为 1.6,在更改为正确的 java 版本后,它启动良好。

评论

0赞 P. Vucinic 7/21/2020
谢谢!您的回答确实帮助了我,因为我在不同的地方更改了服务器配置,但仍然出现问题;按照您的回答解决了问题。我更改配置的方式如下:1)在Eclipse上打开服务器概述2)打开启动配置3)转到选项卡类路径4)为新的JRE / JDK添加bootsrap和用户条目5)删除旧条目6)应用并关闭。我希望它可以帮助某人避免这种错误