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


1571

我正在尝试使用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. PATHJRE或JDK中的变量有什么区别?

您是否也安装了jdk?jre是Java RunTime环境,要创建Java应用程序,还需要jdk
CyprUS 2012年

是的,我做了,现在我的路径变量指向jdk在哪里。但是我仍然有此“不受支持的次要版本51.0”错误,您是否认为我应该安装旧版本的jdk?即时通讯使用jdk 1.7.0
2012年

20
由于最近这些天OSX上的Apple Java 6和Oracle Java 7异常,因此我在Mac OS X上遇到问题时发生了这种情况。简短版本:用JDK7编译,用JDK6运行,得到它。
沃伦·P

7
在java中,ClassName应该以大写字母开头;)
Ashish Panery 2014年

5
对于El Captain,此答案已为我解决:stackoverflow.com/a/34201991/1615594
tsuz

Answers:


1938

显示的版本号描述了与类文件兼容的JRE的版本。

报告的主要数字是:

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有关设置没有bootclasspath的较旧源的警告


167
“显示的版本号描述了如果使用Java编译代码的版本。” 不,不是的。 它显示了与类文件兼容的JRE版本。使用交叉编译选项,您可以使用1.7 JDK编译类版本为1.1(至1.7)的代码。
Andrew Thompson

85
此答案没有按照问题的要求解释如何解决?
Jonathan Leung

7
这是一个直接从Eclipse编译到先前版本的好解决方案:stackoverflow.com/a/16345710/2091700
Alphaaa 2013年

19
在eclipse project => Properties => java编译器中; 根据您的jre或jdk将“编译器合规性级别”设置为版本。对于我来说,它是1.6的jre 1.6
Sam Sam

5
当编译器源设置为与当前正在编译的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的其他工作区复制项目后,产生了这个问题:(
Gana 2014年

366

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


11
+1:将此符号链接(/etc/alternatives/java -> /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java)更改为用于javac编译的版本可解决该问题
ezdazuzena 2013年

1
我该如何做出上述改变?
Ankur Ra​​iyani 2013年

8
项目->属性-> Java编译器启用项目特定设置。然后选择Compiler Compliance Level到1.7、1.6或1.5,构建并测试您的应用。
Vivek Kumar Ray

当我转向Java 7时,Eclipse不知何故一直尝试在Java 6中运行……不知道为什么。卸载旧的JDK对我有用。
HDave 2013年

9
@ezdazuzena用于sudo update-alternatives --config java这样做。
托尔比约恩Ravn的安德森

115

在Eclipse中,我只是转到菜单命令窗口 -> 首选项 -> Java- > 编译器,然后将“编译器遵从级别”设置为1.6。


3
在Eclipse中,有时还需要将项目方面更改为适当的Java版本。
Bilal Mirza

6
谢谢。值得注意的是,设置Eclipse的默认执行环境(在构建路径上的JRE)是一个单独的设置。我已经设置了JRE,但没有设置编译器的遵从级别。这样就解决了。
wchargin

您如何从错误消息中得出结论:这是设置选项的正确位置?
亚历山大

也许这是:stackoverflow.com/questions/7073485/…可以帮助您使用ant和eclipse。
OuuGiii

问题是关于Notepad ++,而不是Eclipse。
gotwo

60

不用担心,我已经解决了。

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

JRE 6-> JDK 6

JRE 7-> JDK 7

等等。


29
Java 7也可以处理6,也没有任何问题。
damienix

@damienix您可能想要指定Java 7 JRE可以毫无问题地处理Java 6编译类,否则您的声明会引起混乱。
Frontear '19

43

此错误表示您正在尝试加载使用比您所安装的Java更高版本编译的Java“类”文件。

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

因此,解决方案是:

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

    javac FileName.java

对于开发人员,如果其他开发人员签入.class文件,并且他们拥有比您更高的Java版本,则可能会发生这种情况!


22

您正在尝试使用不支持编译代码的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


18

在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


16

在Eclipse的菜单窗口 -> 首选项 -> Java- > 编译器中,还请检查“配置项目特定设置”。

如果您在使用相同Java版本时仍然遇到错误:请尝试手动删除项目的build文件夹。然后重新启动Eclipse。


14

您可以使用Java 7编译一些JAR库,而只有Java 6作为Java Runtime。某些新库可能会发生这种情况。


14

最常见的问题是JAVA_HOME变量的配置错误,如果您已安装多个变量,则该变量应指向正确的Java Development Kit库。

要查找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 Runtime Environment。如果要开发Java程序,请安装该java-1.7.0-openjdk-devel软件包。

BSD

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

请参阅:OpenJDK Wiki页面

视窗

只需从Oracle站点安装适当的Java SE Development Kit库或安装

詹金斯

如果您在Jenkins上遇到此问题,请参阅:

但是,update-alternatives应该选择正确的Java版本(较新)。


将Spark服务添加到具有Cloudera的集群后,尝试在主机上使用spark2-shell时,此答案对我有用。
阿尔特

12

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

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

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

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

这为我解决了不受支持的重大次要问题。



12

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

我在Eclipse中的解决方案:

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

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

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

那对我有用。


11

正如其他人在其他地方回答的那样,该Java程序正在比其编译版本更旧的Java上运行。为了向后兼容,需要对其进行“交叉编译”。换句话说,源Java版本和目标Java版本之间不匹配。

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

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

看来您可以只从Internet下载rt.jar并指向它。但这不是太优雅:

javac -source 1.6 -target 1.6 -bootclasspath ./rt.jar HelloWorld.java

10

基于此...

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中,右键单击包浏览器中的项目:

构建路径 -> 配置构建路径

下:

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

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


10
  • 如果使用Maven,请设置Java编译级别。打开命令行并编写java -version您的编译级别:

    在此处输入图片说明

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

    在此处输入图片说明


更改pom之后,我还需要进行maven全新安装。
乔·博里斯科

10

如果在使用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>
       .....

更新:如果使用的是JDK 8,则将source和设置target1.8


有关如何使用插件进行交叉编译的摘要,将非常有用,而不是访问/打开链接。
coding_idiot 2014年

8

从Eclipse运行Ant时,我有相同的错误消息,但是这里提到的其他解决方案不能解决我的问题。有趣的是,从Windows命令行运行Ant运行正常,因此它必须是Eclipse中的配置问题。

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

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

8

我如何解决它?

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

要修复它,您可以

a)使用将用于运行它的相同或更旧版本的Java编译器来编译Java源代码。即安装适当的JDK。

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

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

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

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

当然,要进行编译,请安装并配置所需的特定JDK。

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

JRE或JDK中的PATH变量之间有什么区别?

PATH环境变量告诉命令外壳在哪里查找您键入的命令。当您键入时java,命令外壳解释器将PATH从左到右浏览该变量中指定的所有位置,以找到合适的java运行时可执行文件。如果您安装了Java的多个版本-即您java在PATH变量中指定的多个位置中都具有可执行文件,则从左到右执行时遇到的第一个将是执行的那个。

编译器命令是javac并且仅随JDK一起提供。运行时命令是javaJDK附带的,并且在JRE中。

您可能已经安装了一个版本(51.0 = Java 7)javac,并且还安装了相同版本java,但是javaPATH的较早版本出现了另一个先前版本,因此正在调用该版本,而不是您期望的版本。


7

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

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

javac -version

java -version

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

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

which javac会告诉您位置,例如/usr/bin/javac。只需直接使用运行即可/usr/bin/java <program>

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


6

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


6

今天,此错误消息出现在Ubuntu 12.04.2 LTS(精确的穿山甲)上的Tomcat 7中:

/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:控制器/ ReqAccept:不支持的major.minor版本51.0(无法加载类控制器。ReqAccept)

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

原来,有人使用“服务tomcat [停止/启动]”重新启动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

我解决了 我跑了:

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

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

该错误应该是:

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


6

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

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

因此,在尝试执行程序时会显示此错误。不支持的major.minor版本xx

问:我已经用Java 7创建了一个应用程序,但是当我的用户尝试运行该应用程序时,会遇到Unsupported 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 6的最终用户触发了对Java 7的自动更新,该问题将消失。尚无确定的时间表,我们希望给开发人员一些时间来解决他们的代码与JDK 7之间的所有问题。

(来源:oracle.com。)


5

哦,Mac OS XI通过设置JAVA_HOME变量能够解决此问题:

export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home

4

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

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

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

因此,当您将默认库用作JRE而不是JDK时,将可以很方便地导入内容,但不会进行编译。

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


3

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

我确实同时安装了JDK6和JDK7,但是我的所有JRE设置在pom和Eclipse中的项目属性页面中均指向1.6。没有大量的Maven更新项目和/或刷新解决了这个问题。

最后,我尝试关闭该项目并重新打开它,这似乎可以解决该问题!高温超导



3
  • 安装JDK 7.0.55并将Java for Eclipse设置为JDK 7.0.55。
  • 通过在构建路径JDK 7.0.55上进行配置,使用JDK 7.0.55构建项目。
  • 通过菜单设置在Eclipse编译器为JDK 7.0.55 的Windows - > 首选项 - > Java的 - > 编译器 -选择1.7。

3

答案是针对这个问题的:

线程“主”中的异常java.lang.UnsupportedClassVersionError:edu / stevens / cs549 / dhts / main / LocalContext:不支持的major.minor版本52.0

我遇到了同样的问题。对于那些在AWS ec2实例中遇到此问题并以某种方式重定向到此问题的人。我正在回答这些问题,并希望分享我的工作方式。我遇到麻烦是因为Amazon EC2实例正在运行Java版本1.7,也许我的项目与它不兼容,因为我正在使用Maven,并且它已经为Java 1.8进行了预配置。所以我安装了新版本的java:

sudo yum -y install java-1.8.0

然后重要的一步是删除旧版本:

sudo yum remove java-1.7.0-openjdk

切记在安装新版本后将其删除,否则它将继续使用相同的旧版本,希望它能解决您的问题,在我的情况下确实如此。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.