如何修复java.lang.UnsupportedClassVersionError:不支持的主版本。次版本

如何修复java.lang.UnsupportedClassVersionError:不支持的主版本。次版本,java,jvm,incompatibility,unsupported-class-version,Java,Jvm,Incompatibility,Unsupported Class Version,我正在尝试使用编辑、运行、编译等一体化工具 我已安装,并且已将path变量设置到…/bin目录 在记事本++中运行Hello world时,我收到以下消息: java.lang.UnsupportedClassVersionError:test_hello_world: 不支持的major.minor版本51.0 在java.lang.ClassLoader.defineClass1Native方法中 位于java.lang.ClassLoader.DefineClassCond未知源 ....

我正在尝试使用编辑、运行、编译等一体化工具

我已安装,并且已将path变量设置到…/bin目录

在记事本++中运行Hello world时,我收到以下消息:

java.lang.UnsupportedClassVersionError:test_hello_world: 不支持的major.minor版本51.0 在java.lang.ClassLoader.defineClass1Native方法中 位于java.lang.ClassLoader.DefineClassCond未知源 ......................................... 我认为这里的问题在于版本;Java的某些版本可能是旧的或太新的

我怎么修理它? 我应该安装JDK,并将path变量设置为JDK而不是JRE吗? JRE或JDK中的PATH变量之间有什么区别?
别担心,我已经解决了

它实际上很简单——您需要用相同的版本安装两个JRE/JDK

JRE 6->JDK 6

JRE 7->JDK 7


等等。

java.lang.UnsupportedClassVersionError发生的原因是编译时JDK较高,运行时JDK较低。

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

报告的主要数字如下:

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, JavaSE9=53, Java SE 8=52, JavaSE7=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-target1.4helloworld.java
对于较新版本的Java编译器,您可能会收到一条关于未设置引导类路径的警告。有关此错误的详细信息,请参阅博客文章。

此错误表示您试图加载的Java类文件是使用比您安装的Java版本更新的Java编译的

例如,您的.class文件可能是为JDK 7编译的,您正在尝试使用JDK 6运行它

因此,解决方案是:

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

javac FileName.java


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

在Eclipse中,我只需进入菜单命令窗口->首选项->Java->编译器,然后将编译器遵从性级别设置为1.6。

您可以使用Java 7编译一些JAR库,而Java运行时只有Java 6。在Eclipse的菜单窗口->首选项->Java->编译器检查中,也可以配置特定于项目的设置


如果在相同的Java版本中仍然存在错误:请尝试手动删除项目的生成文件夹。然后重新启动Eclipse。

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

更改Eclipse菜单中的选项并不符合最初的海报,海报上的人说他/她没有使用Eclipse。在OpenJDK javac 1.7版上,如果使用参数-source和-target,并在编译时提供目标版本(即旧版本)的rt.jar文件,则可以对1.6进行交叉编译。如果您实际安装了1.6JRE,您可以指向它的安装,例如,Ubuntu上的/usr/lib/jvm/java-6-openjdk-i386/JRE/lib/rt.jar,SunOS上的/usr/jdk/jdk1.6.060/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

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

当你越来越

Unsupported major.minor version 51.0

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

我在 n我正在使用一个脚本来构建我的应用程序

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

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

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

这对我解决了不受支持的主要次要问题起到了作用。

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

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

在终端中,键入

vi ~/.profile
然后在文件中添加这一行,并保存

export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk<version>.jdk/Contents/Home
然后键入java-version检查结果

java -version 
什么是.profile文件

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


来源:

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

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

转到:运行->外部工具->外部工具配置。。。 如果有多个项目,请为项目选择Ant build.xml 激活选项卡“JRE” 这里选择了“单独的JRE:jre6”。当我将它从1.6或1.7系列更改为JDK时,错误消失了。
如果在使用时遇到此问题,可以使用插件编译代码


更新:如果您使用的是JDK 8,请将source和target设置为1.8。

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

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

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

因此,当您将默认库作为JRE而不是JDK时,您将有一段很好的导入时间,但它不会编译


相反,请将路径设置为JDK I use NetBeans,然后在NetBeans/etc/NetBeans.conf中使用NetBeans.conf设置它们并更改路径。

今天,这条错误消息出现在我们的《精确穿山甲》7中:

/var/log/tomcat7/localhost.2014-04-08.log: 2014年4月8日上午9:00:55 org.apache.catalina.core.StandardContext filterStart 严重:启动过滤器struts2时出现异常 java.lang.UnsupportedClassVersionError:controller/ReqAccept:Unsupported major.minor version 51.0无法加载类controller.ReqAccept

应用程序是用Java7编译的

事实证明,有人使用服务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

这会导致不受支持的MARGY.minor版本51.0错误

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

$ps-ef | grep java tomcat7 31886 180 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


当我回到Java6并尝试运行以前用Java7编译的类时,我遇到了这个问题。对我起作用的是“首选项”>“java”>“编译器”>“将法规遵从性级别设置为1.6”,关键是配置项目设置

基于此

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中,右键单击package explorer中的project:

生成路径->配置生成路径

根据:

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


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

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

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


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

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

安装JDK 7.0.55并为JDK 7.0.55设置Java。 通过在构建路径JDK 7.0.55上配置,使用JDK 7.0.55构建项目。 通过菜单窗口在Eclipse for JDK 7.0.55中设置编译器 ->首选项->Java->编译器-选择1.7。 我解决了。我跑:

JAVA_HOME=/usr/lib/jvm/java-7-openjdk-i386
该错误具有误导性,不支持51.0版的主要.次要版本。这给人的印象是51版Java 7不受支持。我们应该使用Java6

错误应该是:

不支持当前的Java版本50。改用Java V7 51:0及更高版本`


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

我在Eclipse中的解决方案:

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

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

现在转到左边的Java编译器,将编译器遵从性级别更改为您的目标


这对我很有用。

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

要检查此项,请参阅版本信息:

javac -version

java -version
它们将是不同的,javac将有更高的版本号

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

哪个javac将告诉您位置,例如/usr/bin/javac。只需使用/usr/bin/java直接运行即可

也可以将环境变量设置为永久解决方案

我怎么修理它

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

要修复它,您可以

a使用与运行Java编译器相同或更旧的Java编译器版本编译Java源代码。i、 e.安装适当的JDK

b使用较新版本的Java编译器编译Java源代码,但要使用兼容模式。i、 e.使用-target参数

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

您可以检查当前使用的版本 编译器为javac-version,运行时为java-version

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

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

对于运行时,您可以使用JDK或独立JRE附带的版本,但无论如何,请确保您安装了正确的版本,并且您已经配置了路径,这样就不会有任何意外

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

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

编译器命令是javac,只随JDK提供。运行时命令是java,与JDK一起提供,并且在JRE中


很可能您安装了一个版本51.0=Java7的javac,并且您也安装了相同版本的Java,但是另一个早期版本的java出现在路径中,因此被调用,而不是您期望的版本。

最常见的问题是java_HOME变量的配置错误,如果您安装了多个java开发工具包,该变量应指向正确的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-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集合中有一个名为OpenJDK 7的包,可能需要重新配置

请参阅:

窗户 只需从或安装中安装适当的JavaSE开发工具包库

詹金斯 如果Jenkins遇到此问题,请参阅:


但是,选择具有更新替代方案的正确版本的Java较新版本应该是可行的。

哦,Mac OS X我通过设置Java_HOME变量解决了这个问题:

export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home
如果使用Maven,请设置Java编译级别。打开命令行并为其编写java-version 您的编译级别:

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


您的Java文件是用一个不同的版本编译的,它的编译器版本比您试图运行它的运行时版本低

基本的理解是,使用较低版本编译的类预期将在较高版本中运行。但是,使用较高的编译器版本编译并尝试使用较低的运行时版本运行它,有时是不可能的

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

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

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


来源:。

在我的案例中,问题在于服务器运行时配置:

检查JRE是否为您所需的版本:



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

您也安装了jdk吗?jre是Java运行时环境,要创建Java应用程序,您也需要jdk是的,现在我的path变量指向jdk所在的位置。但是我仍然有这个不受支持的51.0版本的小错误,你认为我应该安装旧版本的jdk吗?我正在使用JDK1.7.0这发生在我的Mac OS X上,当时我遇到了问题,因为最近OSX上出现了奇怪的Apple java 6和Oracle java 7情况。短版本:用JDK7编译,用JDK6运行,得到这个。在java中,类名应该以大写字母开头;对于El Captain来说,这个答案为我解决了这个问题:显示的版本号描述了使用Java编译代码的版本。不,没有。它显示类文件与之兼容的JRE版本。使用可以使用1.7 JDK编译类版本为1.1到1.7的代码。这个答案并没有解释如何解决问题?这是一个很好的解决方案,可以直接从Eclipse编译到以前的版本:在Eclipse项目中=>Proerties=>java编译器;根据您的jre或jdk将编译器遵从性级别设置为版本。对我来说,jre 1.6版本是1.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。将值更改为1.6后,问题得到解决。这个问题源于我从使用JDK1.7的另一个工作区复制项目之后:在eclipse中,有时项目方面也需要更改为适当的java版本。谢谢。值得注意的是,将Eclipse的默认执行环境设置为构建路径上的JRE是一个单独的设置。我设置了JRE,但没有设置编译器遵从性级别;这就解决了问题。您是如何从错误消息中得出结论,认为这是设置选项的正确位置的?也许这样:如果您使用的是ant和eclipse,可能会有所帮助。问题是关于记事本++而不是eclipse。+1:将此符号链接/etc/alternations/java->/usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java更改为使用的版本对于使用javac进行编译,如何进行上述更改?项目->属性->Java编译器启用特定于项目的设置。然后选择Compiler Compliance Level到1.7、1.6或1.5,构建并测试你的应用程序。当我转到Java 7时,Eclipse一直试图在Java 6中运行……不知道为什么。卸载旧的JDK帮了我的忙。@ezdazuzena使用sudo update alternations-config java来完成此操作。java 7也可以处理6而没有任何问题。@damienix您可能想指定java 7 JRE可以处理java 6编译类而没有问题,否则,您的声明将导致混乱。关于如何使用插件进行交叉编译的代码片段将非常有用
很好,在更改pom后,我需要执行maven clean安装,而不是访问/打开linkI。在将spark服务添加到cloudera群集后,当我尝试在主机上使用spark2 shell时,这个答案对我很有用。谢谢!你的回答确实帮助了我,因为我在不同的地方更改了服务器配置,但问题仍然存在;按照你的回答解决了问题。我更改配置的方式如下:1在Eclipse上打开服务器概览2打开启动配置3转到选项卡类路径4添加新JRE/JDK的bootsrap和用户条目5删除旧条目6应用并关闭。我希望它能帮助人们避免这种错误
apt-get install openjdk-7-jre
yum install java-1.7.0-openjdk java-1.7.0-openjdk-devel
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home