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

我正在尝试使用Notepad ++作为我的所有function于一身的工具编辑,运行,编译等。

我已经安装了JRE ,并且已经将pathvariables设置为… / 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,并将我的pathvariables设置为JDK而不是JRE?
  3. JRE或JDK中的PATHvariables有什么区别?

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

报道的主要数据是:

 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编译器的目标参数来指示编译器创build与早期Java版本兼容的代码。

例如,为了生成与Java 1.4兼容的类文件,请使用以下命令行:

 javac -target 1.4 HelloWorld.java 

使用较新版本的Java编译器,您可能会得到关于未设置的引导类path的警告。 有关此错误的更多信息,请参阅博客文章新buildjavac警告,以便在不使用bootclasspath的情况下设置较旧的源代码

发生java.lang.UnsupportedClassVersionError是因为编译期间JDK较高,运行时JDK较低。

在Eclipse中,我刚刚进入菜单命令窗口 – > 首选项 – > Java – > 编译器 ,然后将“编译器符合级别”设置为1.6。

别担心,我解决了。

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

JRE 6 – > JDK 6

JRE 7 – > JDK 7

等等。

这个错误意味着你正试图加载一个Java版本的“class”文件,这个文件是用比你所安装的更新版本的Java编译的。

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

所以解决办法是:

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

    javac FileName.java

对于开发人员来说,如果另一个开发人员检查一个.class文件,就会发生这种情况,而且他们已经拥有了比你更新的Java版本!

您正尝试使用不支持代码编译版本的Java版本来运行程序。 所以基本上你必须用更高的版本编译你的代码,然后试着用更低的版本来运行它。

正如你所得到的

 Unsupported major.minor version 51.0 

而版本51.0对应于J2SE 7,你很可能已经在Java 7中编译了你的代码,并试图使用较低的版本来运行它。 检查显示的是什么java -version 。 它应该是Java 7的版本。 如果没有在PATH / JAVA_HOME中做适当的修改。 或者,您可以使用与您尝试运行代码的版本相同的版本进行编译。 如果configuration令人困惑,则可以始终提供绝对path/home/user/jdk1.7.0_11/bin/javac/home/user/jdk1.7.0_11/bin/java

我在Mac上也有类似的情况,下面的过程对我有用:

在terminal中input

 vi ~/.profile 

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

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

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

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

 source ~/.profile 

然后键入java -version来检查结果

 java -version 

什么是.profile文件?

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

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

在Eclipse的菜单窗口 – > 首选项 – > Java – > 编译器中检查“configuration项目特定设置”。

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

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

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

我在Eclipse中的解决scheme:

  • 右键单击你的项目属性 – > Java构buildpath – >库

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

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

这对我有效。

最常见的问题是您的JAVA_HOMEvariables的configuration错误,如果您已经安装了多个应用程序,那么该variables应该指向正确的Java Development Kit库。

要findSDK 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如果需要。

select替代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包,可能需要重新configuration。

请参阅: OpenJDK wiki页面 。

视窗

只需从Oracle站点安装适当的Java SE开发工具包库或安装即可

jenkins

如果您遇到与Jenkins有关的问题,请参阅:

  • JENKINS-30561 – 无法使用SSH启动代理

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

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

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

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

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

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

这有助于我解决不受支持的主要小问题。

正如几个人在其他地方所回答的,Java程序正在运行在一个Java版本的旧版本上,而不是它所编译的版本。 为了向后兼容,它需要被“交叉编译”。 换句话说,源和目标Java版本之间存在不匹配。

在Eclipse菜单中更改选项不会回答原始的海报,他/她不使用Eclipse。 在OpenJDK javac版本1.7上,如果使用参数-source-target ,则可以交叉编译1.6,并且在编译时提供目标版本(即较旧版本)的rt.jar文件。 如果实际上安装了1.6 JRE,则可以指向它的安装(例如,Ubuntu上的/usr/lib/jvm/java-6-openjdk-i386/jre/lib/rt.jar,/ usr / jdk / jdk1。显然,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 

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

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

基于这个…

 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中,右键单击包资源pipe理器中的项目:

构buildpath – > configuration构buildpath

下:

Java Build Path – > Libraries – > Add Library – > JRE System Library – > Installed JREs – > Search

search完成后,通过select可用列表中的库来添加所需的JRE。

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

    在这里输入图像说明

  • 如果您使用IntelliJ IDEA,请select项目→ 文件设置构build执行部署编译器Java编译器 。 然后像这样的图像更改字节码为1.7:

    在这里输入图像说明

我该如何解决?

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

要解决它,你也可以

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

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

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

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

我应该安装JDK,并将我的PATHvariables设置为JDK而不是JRE?

对于编译,当然,安装和configuration你想要的特定的JDK。

对于运行时,您可以使用JDK自带的JRE或独立的JRE,但不pipe怎样,确保已经安装了正确的版本,并且已经configuration了PATH,这样就没有任何意外。

JRE或JDK中的PATHvariables有什么区别?

PATH环境variables告诉命令shell在哪里查找您input的命令。 键入java ,命令解释程序将从左到右浏览PATHvariables中指定的所有位置,以查找要运行的适当的java运行时可执行文件。 如果您安装了多个Java版本 – 即在PATHvariables中指定了多个位置的java可执行文件,则从左向右遇到的第一个文件将是执行的文件。

编译器命令是javac ,只有JDK自带。 运行时命令是java并随JDK一起提供,位于JRE中。

您可能已经安装了一个javac版本(51.0 = Java 7),并且您也安装了相同版本的java ,但java另一个早期版本出现在PATH的早期版本中,因此正在调用,而不是你期待的一个。

从Eclipse运行Ant时,我遇到了同样的错误信息,但是这里提到的其他解决scheme并没有解决我的问题。 有趣的是,从Windows命令行运行Ant运行良好,所以它必须是Eclipse中的configuration问题。

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

  • 转到:运行 – >外部工具 – >外部工具configuration…
  • 为您的项目selectAnt build.xml(如果您有多个项目)
  • 激活选项卡'JRE'
  • 这里被选中了“独立的JRE:jre6”。 当我将其更改为1.6或1.7系列的JDK时,错误消失了。

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

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

 javac -version java -version 

它们会不同,而且javac会有更高的版本号。

为了解决这个问题,从JDK版本运行使用java,或者如果你有一个更新的JRE / JDK,也可以。

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

或者您可以将环境variables设置为永久性解决scheme。

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

有这个问题,当我恢复到Java 6,并试图运行以前编译的Java 7的类。对我的工作是首选项> java>编译器 – >合规性级别设置为1.6,关键是“configuration项目设置”。

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

/var/log/tomcat7/localhost.2014-04-08.log:
2014年4月8日上午9时55分55秒org.apache.catalina.core.StandardContext filterStart
严重:exception开始filterstruts2
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”

哦,Mac OS XI能够通过设置JAVA_HOMEvariables来解决这个问题:

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

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

这是基本的理解,低版本编译的类预计将运行在更高的版本。 但是相反(编译器版本较高,试图用较低的运行时版本运行)有时是不可能的。

因此,当你试图执行你的程序时,你会看到这个错误。 不受支持的major.minor版本xx

问:我已经在Java 7中创build了一个应用程序,但是当我的用户试图运行它时,他们得到一个不受支持的major.minor版本51.0错误。 这是什么意思,我能做些什么呢?

答:如果您在Java 7中使用javac编译应用程序,则生成的类文件将具有51.0版本号。 7之前的Java版本不能识别这个数字,所以你的用户在运行你的应用程序之前必须升级到Java 7。 如果您没有使用任何Java 7 API,则可以尝试使用javac -target 1.6来编译您的应用程序以创build与1.6兼容的类文件。 如果使用webstart部署应用程序,则可以指定所需的最低版本。 有关更多信息,请参阅Java Web Start和JNLP上的文档。 一旦我们触发了自动更新到Java 7的桌面上当前拥有Java 6的最终用户,这个问题就会消失。 这个时间表还没有确定,我们希望给开发人员时间来解决他们的代码和JDK 7之间的任何问题。

(来源: oracle.com )

我遇到了这个问题,为了运行我的unit testing,我不得不从命令行运行一个Maven编译, 如果我对testing类进行了更改并让Eclipse自动重新编译,那么我得到了“Unsupported major.minor version 51.0”错误。

我确实安装了JDK6和JDK7,但是我所有的JRE设置都指向1.6,不pipe是在pom中,还是在Eclipse中的项目属性页面。 没有多lessMaven Update Project和/或刷新解决了这个问题。

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

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

首先让我们得到一些基本的权利…

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

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

所以,当你的默认库作为JRE而不是JDK时,你将有一个很好的时间导入的东西,但它不会编译。

相反,将path设置为JDK(我使用NetBeans,并在netbeans / etc / netbeans.conf中使用netbeans.conf设置它们并更改path)。

我解决了它。 我跑了:

 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和更高版本)

  • 安装JDK 7.0.55并为JDK 7.0.55设置Java for Eclipse 。
  • 通过在构buildpathJDK 7.0.55上configuration,使用JDK 7.0.55构build项目。
  • 在Eclipse的JDK 7.0.55中通过菜单Windows – > 首选项 – > Java – > 编译器 – select1.7来编译器

另一种方法来解决这个问题在Mac OS X上安装了Homebrew ,是这样的:

 brew install Caskroom/cask/java