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


我正在尝试使用 记事本+ + 作为我的一体化工具编辑,运行,编译等。

我有 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. 有什么区别 PATH JRE或JDK中的变量?

1386
2018-04-30 11:28


起源


你也安装了jdk吗? jre是Java RunTime环境,要创建java应用程序,还需要jdk - CyprUS
是的,我做了,现在我的路径变量指向jdk的位置。但我仍然有这个“不支持的小版本51.0”错误你认为我应该安装旧版本的jdk?我使用的是jdk 1.7.0 - ERJAN
当我遇到问题时,由于OSX上的奇怪的Apple java 6和Oracle java 7情况,我在Mac OS X上发生了这种情况。简短版本:用JDK7编译,用JDK6运行,得到这个。 - Warren P
在java ClassName中应该以大写字母开头;) - Ashish Panery
对于El Captain,这个答案为我解决了这个问题: stackoverflow.com/a/34201991/1615594 - tsuz


答案:


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

报告的主要数字是:

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编译器,您可能会收到有关未设置引导类路径的警告。博客文章中提供了有关此错误的更多信息 用于设置没有bootclasspath的旧源的新javac警告


1774
2017-07-11 11:59



“显示的版本号描述了使用Java编译代码的版本。”  不,不是的。  它显示了类文件兼容的JRE版本。运用 交叉编译选项 您可以使用1.7 JDK来编译类版本为1.1(通过1.7)的代码。 - Andrew Thompson
这个答案没有解释如何解决问题? - Jonathan Leung
这是直接从Eclipse编译到以前版本的一个很好的解决方案: stackoverflow.com/a/16345710/2091700 - Alphaaa
在eclipse项目中=> Proerties => java编译器;根据您的jre或jdk将“编译器合规性级别”设置为版本。至于我,它是1.6的jre 1.6 - Sam
当编译器源设置为不符合当前编译的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


java.lang.UnsupportedClassVersionError 因为在编译期间JDK较高而在运行时期间JDK较低。


328
2018-06-28 06:48



+1:更改此符号链接(/etc/alternatives/java -> /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java)用于编译的版本用javac解决了它 - ezdazuzena
我怎样才能做出以上改变? - Ankur Raiyani
项目 - >属性 - > Java编译器启用项目特定设置。然后选择编译器合规性级别为1.7,1.6或1.5,构建并测试您的应用程序。 - Vivek Kumar Ray
更多详情请参阅链接 vivekraicdac.blogspot.in - Vivek Kumar Ray
@ezdazuzena使用 sudo update-alternatives --config java 这样做。 - Thorbjørn Ravn Andersen


在Eclipse中,我只是去了菜单命令 窗口  - > 优先  - > Java的  - > 编译器 然后将“编译器合规性级别”设置为1.6。


111
2018-05-02 18:58



在eclipse中,有时项目方面也需要更改为适当的java版本。 - Bilal Mirza
谢谢。值得注意的是,设置Eclipse的默认执行环境(构建路径上的JRE)是一个 分离 设置。我设置了JRE但不是编译器合规级别;这固定了。 - wchargin
您是如何从错误消息中得出结论,这是设置选项的正确位置? - Alexander
也许这个: stackoverflow.com/questions/7073485/... 如果你使用蚂蚁和日食,可以帮助。 - OuuGiii


别担心,我解决了。

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

JRE 6 - > JDK 6

JRE 7 - > JDK 7

等等。


55
2018-05-04 06:23



java 7也可以毫无问题地处理6。 - damienix


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

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

所以解决方案是:

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

    javac FileName.java

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


37
2018-02-20 19:02



在罐子里面。 - Chris


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


20
2017-10-01 08:51





我在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


17
2018-02-11 06:55





在Eclipse的菜单中 窗口  - > 优先  - > Java的  - > 编译器 另请参阅“配置项目特定设置”。

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


15
2017-08-06 10:24





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


13
2018-06-25 12:51





最常见的问题是您的配置错误 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运行时环境。如果要开发Java程序,请安装 java-1.7.0-openjdk-devel 包。

BSD

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

看到: OpenJDK维基页面

视窗

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

詹金斯

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

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


13
2018-04-04 12:16



在使用cloudera将spark服务添加到集群后,尝试在主机上使用spark2-shell时,这个答案对我有用。 - Alter