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

ERJ*_*JAN 1532 java jvm incompatibility unsupported-class-version

我正在尝试使用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)
       .........................................
Run Code Online (Sandbox Code Playgroud)

我认为这里的问题是版本问题; 某些版本的Java可能是旧的或太新的.

  1. 我如何解决它?
  2. 我应该安装JDK,并将我的路径变量设置为JDK而不是JRE吗?
  3. .../binJRE或JDK中的变量有什么区别?

Juh*_*äki 1912

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

报告的主要数字是:

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
Run Code Online (Sandbox Code Playgroud)

(来源:维基百科)

要解决实际问题,您应该尝试使用较新版本的Java JRE运行Java代码,或者指定Java编译器的目标参数,以指示编译器创建与早期Java版本兼容的代码.

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

javac -target 1.4 HelloWorld.java
Run Code Online (Sandbox Code Playgroud)

使用较新版本的Java编译器,您可能会收到有关未设置引导类路径的警告.有关此错误的更多信息,请参阅博客文章New javac warning,以设置没有bootclasspath的旧源.

  • *"显示的版本号描述了使用Java编译代码的版本."***不是.**它显示了类文件兼容的JRE版本.使用[交叉编译选项](http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html#crosscomp-options),您可以使用1.7 JDK来编译一个类的代码版本1.1(通过1.7). (163认同)
  • 这个答案没有解释如何解决问题? (85认同)
  • 在eclipse项目中=> Proerties => java编译器; 根据您的jre或jdk将"编译器合规级别"设置为版本.至于我,它是1.6的jre 1.6 (19认同)
  • 这是直接从Eclipse编译到以前版本的一个很好的解决方案:http://stackoverflow.com/a/16345710/2091700 (7认同)
  • 当编译器源设置为不符合当前编译的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的不同工作区复制项目后:( (5认同)

Viv*_*Ray 358

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

  • +1:将这个符号链接(`/ etc/alternatives/java - >/usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java`)改为用javac编译的版本解决了它 (11认同)
  • @ezdazuzena使用`sudo update-alternatives --config java`来实现. (9认同)
  • 项目 - >属性 - > Java编译器启用项目特定设置.然后选择编译器合规性级别为1.7,1.6或1.5,构建并测试您的应用程序. (8认同)
  • 我怎样才能进行上述更改? (2认同)

Cac*_*sky 115

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

  • 谢谢.值得注意的是,设置Eclipse的默认执行环境(构建路径上的JRE)是*单独*设置.我设置了JRE但不是编译器合规级别; 这解决了它. (6认同)
  • 在eclipse中,有时项目方面也需要更改为适当的java版本. (3认同)

ERJ*_*JAN 58

别担心,我解决了.

它实际上很简单 - 您需要使用相同的版本安装BOTH JRE/JDK.

JRE 6 - > JDK 6

JRE 7 - > JDK 7

等等.

  • java 7可以处理6而没有任何问题. (27认同)

Bra*_*rks 43

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

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

所以解决方案是:

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

    javac FileName.java

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

  • 在罐子里面. (4认同)

Ani*_*kur 22

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

随着你的到来

Unsupported major.minor version 51.0
Run Code Online (Sandbox Code Playgroud)

和版本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.


Ton*_*ony 18

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

在终端中输入

vi ~/.profile
Run Code Online (Sandbox Code Playgroud)

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

export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk<version>.jdk/Contents/Home
Run Code Online (Sandbox Code Playgroud)

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

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

source ~/.profile 
Run Code Online (Sandbox Code Playgroud)

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

java -version 
Run Code Online (Sandbox Code Playgroud)

什么是.profile文件?

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

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


And*_* L. 16

在Eclipse的菜单窗口 - > 首选项 - > Java - > 编译器中也检查"配置项目特定设置".

如果您在同一Java版本中出现错误:尝试手动删除项目的构建文件夹.然后重启Eclipse.


小智 14

您可以在Java 7中编译一些JAR库,并且只有Java 6作为Java Runtime.一些新的库可能会发生这种情况.


ken*_*orb 14

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

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

jrunscript -e 'java.lang.System.out.println(java.lang.System.getProperty("java.home"));'
Run Code Online (Sandbox Code Playgroud)

于Debian/Ubuntu

要检查您安装的java(openjdk),请通过以下方式检查:

dpkg -l "openjdk*" | grep ^i
Run Code Online (Sandbox Code Playgroud)

要么:

update-java-alternatives -l
Run Code Online (Sandbox Code Playgroud)

要更改它,请使用:

update-alternatives --config java
Run Code Online (Sandbox Code Playgroud)

sudo如果需要,带前缀.

选择替代java版本.

或者检查哪些可供安装:

apt-cache search ^openjdk
Run Code Online (Sandbox Code Playgroud)

sudo如果需要,带前缀.

然后你可以安装,例如:

apt-get install openjdk-7-jre
Run Code Online (Sandbox Code Playgroud)

sudo如果需要,带前缀.

Fedora,Oracle Linux,Red Hat

安装/升级适当的包:

yum install java-1.7.0-openjdk java-1.7.0-openjdk-devel
Run Code Online (Sandbox Code Playgroud)

java-1.7.0-openjdk软件包仅包含Java Runtime Environment.如果要开发Java程序,请安装该java-1.7.0-openjdk-devel程序包.

BSD

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

请参阅:OpenJDK维基页面.

视窗

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

詹金斯

如果您遇到Jenkins的这个问题,请参阅:

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


Man*_*dit 12

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

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

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

<target name="build-java" depends="prepare-build">
    <echo message="Compiling java files"/>
    <javac ....
           target="1.5"...
    </javac>
</target>
Run Code Online (Sandbox Code Playgroud)

这对我有用,可以解决不受支持的主要小问题.


小智 12

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


小智 12

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

我在Eclipse中的解决方案:

  • 右键单击Project Properties - > Java Build Path - > Libraries

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

  • 现在转到左侧的Java Compiler,并将Compiler compliance level更改为您的目标.

这对我有用.


Mac*_*ala 11

正如几个人在其他地方所解释的那样,Java程序运行在Java的旧版本上,而不是编译它的版本.它需要"交叉编译"以实现向后兼容.换句话说,源Java版本和目标Java版本之间存在不匹配.

更改Eclipse菜单中的选项无法回答原始海报,他说他/她没有使用Eclipse.在OpenJDK javac 1.7版本中,如果使用参数-source,则可以交叉编译为1.6 ,并且在编译时-target提供目标版本的rt.jar -file(即旧版本).如果您实际安装了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
Run Code Online (Sandbox Code Playgroud)

看起来你可以从互联网上下载rt.jar,然后指向它.这不是太优雅了:

javac -source 1.6 -target 1.6 -bootclasspath ./rt.jar HelloWorld.java
Run Code Online (Sandbox Code Playgroud)


Tha*_*wda 10

如果您在使用Maven时遇到此问题,可以使用插件Maven编译器交叉编译代码.

 <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>
       .....
Run Code Online (Sandbox Code Playgroud)

更新:设置sourcetarget1.8,如果你使用的是JDK 8.


Adi*_* Ya 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
Run Code Online (Sandbox Code Playgroud)

在Eclipse中,右键单击package explorer中的项目:

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

下:

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

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


eth*_*lan 10

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

    在此输入图像描述

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

    在此输入图像描述


小智 8

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

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

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


Vih*_*ung 8

我如何解决它?

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

要修复它,你也可以

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

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

c)在JRE中运行已编译的类,该JRE与用于编译类的JDK相同或更新.

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

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

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

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

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

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

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

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


L L*_*iet 7

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

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

javac -version

java -version
Run Code Online (Sandbox Code Playgroud)

它们将是不同的,javac将具有更高的版本号.

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

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

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


ora*_*oon 6

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

/var/log/tomcat7/localhost.2014-04-08.log:Apr8,2014
9:00:55 AM org.apache.catalina.core.StandardContext filterStart
SEVERE:异常启动过滤器struts2
java.lang.UnsupportedClassVersionError:controller/ReqAccept:不支持的major.minor版本51.0(无法加载类controller.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 version"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 version"1.7.0_15"


小智 6

当我恢复到Java 6,并试图运行先前的Java 7编译的类什么工作对我来说是首选项>的Java>编译器有这个问题 - >设置合规水平1.6和关键"配置项目设置" ..


Sid*_*rth 6

我解决了 我跑了:

JAVA_HOME=/usr/lib/jvm/java-7-openjdk-i386
Run Code Online (Sandbox Code Playgroud)

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

该错误应该是:

当前的Java版本50不受支持.使用Java版本7(51:0和更高版本)代替


Man*_*har 6

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

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

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

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

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

(来源:oracle.com.)


Tom*_*Tom 5

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

export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home
Run Code Online (Sandbox Code Playgroud)