如何修复 java.lang.UnsupportedClassVersionError:不支持的 major.minor 版本
Posted
技术标签:
【中文标题】如何修复 java.lang.UnsupportedClassVersionError:不支持的 major.minor 版本【英文标题】:How to fix java.lang.UnsupportedClassVersionError: Unsupported major.minor version 【发布时间】:2021-07-20 06:36:31 【问题描述】:我正在尝试使用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 版本可能太旧或太新。
-
如何解决?
是否应该安装 JDK,并将路径变量设置为 JDK 而不是 JRE?
JRE 和 JDK 中的
PATH
变量有什么区别?
【问题讨论】:
你也安装了jdk吗? jre 是 Java RunTime 环境,要创建 java 应用,还需要 jdk 是的,我做到了,现在我的路径变量指向 jdk 所在的位置。但是我仍然有这个“不支持的次要版本 51.0”错误你认为我应该安装旧版本的 jdk 吗?我正在使用 jdk 1.7.0 这发生在我的 Mac OS X 上,因为这些天我在 OSX 上遇到了奇怪的 Apple java 6 和 Oracle java 7 情况。短版:用JDK7编译,用JDK6运行,搞定。 在 java 中的 ClassName 应该以大写字母开头 ;) 对于 El Captain,这个答案为我解决了这个问题:***.com/a/34201991/1615594 【参考方案1】:显示的版本号描述了类文件兼容的 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,
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
(来源:Wikipedia)
要解决实际问题,您应该尝试使用较新版本的 Java JRE 运行 Java 代码,或者为 Java 编译器指定目标参数以指示编译器创建与早期 Java 版本兼容的代码。
例如,为了生成与 Java 1.4 兼容的类文件,请使用以下命令行:
javac -target 1.4 HelloWorld.java
使用较新版本的 Java 编译器,您可能会收到有关未设置引导类路径的警告。有关此错误的更多信息,请参阅博文 New javac warning for setting an older source without bootclasspath。
【讨论】:
“显示的版本号描述了如果使用 Java 编译代码的版本号。” 不。类文件兼容的 JRE。使用cross-compilation options,您可以使用 1.7 JDK 编译类版本为 1.1(到 1.7)的代码。 这个答案没有解释如何解决问题? 这是一个很好的解决方案,可以直接从 Eclipse 编译到以前的版本:***.com/a/16345710/2091700 IN 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 后问题得到解决。问题源于我从使用 JDK 1.7 的不同工作区复制项目后:(【参考方案2】:如果有人在使用 Gradle,则将其放入 build.gradle
java
sourceCompatibility = JavaVersion.VERSION_1_7
targetCompatibility = JavaVersion.VERSION_1_7
在上述情况下,我们告诉编译器使字节码与版本 java 7(我要运行该类的 java 版本)兼容。
【讨论】:
【参考方案3】:许多答案是指 IDE 之类的 Eclipse。但是,这个问题与使用 Notepad++ 的本机开发有关。
命名错误的核心原因是使用的Java运行时环境和使用的类和库不匹配。以下描述的目标是无需任何额外安装即可编译。
1)
检查PATH
变量中的定义。如果有定义:
C:\Program Files (x86)\Common Files\Oracle\Java\javapath
和/或
C:\ProgramData\Oracle\Java\javapath
这些路径链接到具有固定 java 版本的 java/javac。您可以使用javac -version
在此文件夹中检查此版本。结果可以是:
java version "1.8.0_231"
这意味着,Java 版本 8 正在使用中。
将此条目替换为 %JAVA_HOME%\bin
。
如果JDK是手动安装的,请检查环境中是否设置了JAVA_HOME
。如果没有,请在此处添加,例如与:
JAVA_HOME="C:\Program Files\Java\jdk1.7.0_80"
2)
我已经用 gradle 在命令行上构建了项目。在build.gradle
中定义:
android
buildToolsVersion "24.0.1"
dependencies
compile 'com.android.support:design:23.0.1'
compile 'com.android.support:support-v4:23.0.1'
...
...
使用的build-tools
dx 文件比其他组件更新。因此需要修改:
buildToolsVersion "23.0.1"
【讨论】:
【参考方案4】:在我的情况下,问题是由于 $JAVA_HOME 和 $PATH 中的 Java 版本不同而发生的。
echo $JAVA_HOME
/usr/lib/jvm/java-7-openjdk-amd64/jre
echo $PATH
/opt/jdk/jdk1.8.0_151/bin:/usr/lib/jvm/java-7-openjdk-amd64/jre/bin:/usr/local/bin:/usr/bin:/bin
一旦我将它们更新为相同版本的 Java,问题就消失了。
export JAVA_HOME=/opt/jdk/jdk1.8.0_151
export PATH=$JAVA_HOME/bin:$PATH
【讨论】:
【参考方案5】:如您所知,为 jdk(Java 开发工具包)bin 目录设置环境变量 Java_home 始终是一个好习惯。
在上面查看您的问题似乎 JRE-运行时环境正在寻找与 JDk 的 Superset 库不兼容的类。我建议直接从 Oracle 下载源获取完整的 JDK 和 JRE 或 Jboss(如果需要)包,以避免任何此类问题。
【讨论】:
【参考方案6】:如果您在使用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
和 target
设置为 1.8
。
【讨论】:
一个关于如何使用插件交叉编译的sn-p会非常好,而不是访问/打开链接【参考方案7】:由于 java 9 -target
被 --release
替换。
在 java 11 之前,--release
的可用号码为 6
7
、8
、9
、10
、11
。
你可以猜到未来的版本会是12
、13
,然后继续。
要为较旧的目标 jvm 进行编译,使用 javac --release 7 Tmp.java
// 这将生成可以在 jvm >= 7 上运行的 .class 文件,
然后您可以通过以下方式检查目标版本:
javap -v Tmp | grep version
在输出中,major version
标识目标 jvm 版本。
未来版本将移除更多旧版本:
从 java 11 开始,不支持主要版本 (java 版本 。 从 java 12 和 13 开始,不支持主要版本 (java 版本 。您可以通过以下命令了解当前 javac 支持哪些目标版本:javac -help | grep releases
【讨论】:
【参考方案8】:就我而言,问题出在服务器运行时配置中:
检查 JRE 是您需要的版本:
项目是1.7版本,服务器JRE设置为1.6,改成正确的java版本后就可以正常启动了。
【讨论】:
谢谢!您的回答对我很有帮助,因为我在不同的地方更改了服务器配置,但问题仍然存在;按照您的回答解决了问题。我更改配置的方式如下:1)在 Eclipse 上打开服务器概述 2)打开启动配置 3)转到选项卡类路径 4)为新的 JRE/JDK 添加引导程序和用户条目 5)删除旧条目 6)应用并关闭。我希望它可以帮助某人避免这种错误【参考方案9】:确保检查 java 的环境变量版本,这可能只是 JAVA_HOME
(JDK 路径) 和 JRE_HOME
(JRE 路径) 的版本之间的差异,导致问题
【讨论】:
【参考方案10】:问题的答案是:
线程“main”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
请记住在安装新版本后将其删除,否则它将继续使用相同的旧版本,我希望它可以解决您的问题,就我而言。
【讨论】:
【参考方案11】:如果你使用的是ant,你可以在build.xml文件中为编译器指定“目标”,如下所示:
<target name="compile" depends="init">
<javac executable="$JAVA_HOME\bin\javac" srcdir="$src.dir" target="1.6" destdir="$classes.dir" debug="true"
deprecation="true" classpathref="compile.classpath" encoding="utf8">
<include name="**/*.java" />
</javac>
</target>
【讨论】:
【参考方案12】:最常见的问题是您的 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、红帽
通过以下方式安装/升级适当的软件包:
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 包,它可能需要重新配置。
请参阅:OpenJDK wiki page。
窗口
只需从Oracle site 安装适当的 Java SE 开发工具包库或安装
詹金斯
如果您在使用 Jenkins 时遇到此问题,请参阅:
JENKINS-30561 - Unable to launch agent using SSH但是,使用 update-alternatives
选择正确的 Java 版本(较新)应该可以。
【讨论】:
在使用 cloudera 将 spark 服务添加到集群后尝试在主机上使用 spark2-shell 时,此答案对我有用。【参考方案13】:我什么都试过了。重新安装 Tomcat 终于奏效了。这是我在重新安装之前检查的内容。
确保您的环境变量如下所示。
$ echo $JAVA_HOME
C:\Program Files\Java\jdk1.7.0_51\
$ echo $JRE_HOME
C:\Program Files\Java\jdk1.7.0_51\jre\bin
确保 Eclipse 使用与您设置 JAVA_HOME 相同的 jre(如果未设置 JAVA_HOME,它将查看 JRE_HOME)。 Window > Prefrences > Java > Installed JREs
(勾选的是默认的)
如果您对任何 tomcat 文件(尤其是 catalina.bat 或 startup.bat)进行了任何更改,那么您可能会告诉 tomcat 查看与您设置为 JAVA_HOME C:\Program Files (x86)\Apache\apache-tomcat-7.0.26\bin
的版本不同的 java 版本
【讨论】:
除非您描述您的特殊情况,并解释您的为什么这对您有用,否则此建议无济于事。一般来说,重新安装Tomcat并不能解决问题,实际上可能会引入新的问题。 我的情况是这个错误java.lang.UnsupportedClassVersionError
人们会决定他们是否觉得它有帮助。它为我解决了它你怎么能确定它不能。【参考方案14】:
我遇到了同样的问题,我在 Linux 中修复了它。
检查您的$JAVA_HOME
需要 JDK 1.8 来编译/构建 APK
安装 Java JDK 1.8 并更改 JAVA_HOME
编辑~/.bashrc
并将您的JDK 1.8 路径添加为JAVA_HOME
。
export JAVA_HOME=/usr/lib/jvm/java-8-oracle/jre/
还有source ~/.bashrc
关闭当前终端窗口/选项卡并运行$JAVA_HOME
检查路径。
【讨论】:
【参考方案15】:您的 Java 文件是使用与您尝试运行它的版本(较低的运行时版本)不同的版本(更高的编译器版本)编译的。
基本的理解是,使用较低版本编译的类预计会在以后的较高版本中运行。但相反的情况(使用更高的编译器版本编译并尝试使用更低的运行时版本运行)有时是完全不可能的。
因此,在尝试执行程序时会显示此错误。 不支持的major.minor 版本x.x
问:我在 Java 7 中创建了一个应用程序,但是当我的用户尝试 运行它,他们得到一个 Unsupported major.minor version 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 7 适用于当前在其桌面上安装 Java 6 的最终用户。这 时间表尚未确定,我们希望给开发人员 是时候先解决他们的代码和 JDK 7 之间的任何问题了。
(来源:oracle.com.)
【讨论】:
【参考方案16】:我使用的是 OS X v10.11.5 (El Capitan),我尝试设置 JAVA_HOME 并通过 Maven 强制使用“正确”的 Java 版本。没有任何帮助。
问题发生在应用程序仍在运行时注销 OS X 帐户。再次登录后,OS X 会打开旧的终端会话,历史记录显示为灰色。我使用相同的终端会话来构建项目,但由于不支持的类版本错误而失败。
清理 Maven 项目根本没有帮助。
为了解决这个问题,我只需要关闭自动打开的终端窗口并使用一个新的。
【讨论】:
【参考方案17】:如果您使用 Maven,请设置您的 Java 编译级别。打开命令行并为您的编译级别编写java -version
:
如果你使用 IntelliJ IDEA,选择项目 → File → Settings → Build Execution Deployment → Compiler → Java 编译器。然后将字节码更改为 1.7,如下图所示:
【讨论】:
在更改 pom 后,我还需要进行 maven 全新安装。【参考方案18】:我通过检查部署程序集中部署了 Maven 依赖项为我解决了这个问题。在我的情况下,他们不是。
添加它可以解决问题。
【讨论】:
【参考方案19】:将此添加到您的 pom.xml 文件中:
<project ....>
<properties>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
</project>
其中 1.7 是您打算使用的 Java 版本。这会覆盖Maven 编译器设置,因此最好从这里调试。
【讨论】:
【参考方案20】:在安装了Homebrew 的 Mac OS X 上解决此问题的另一种方法是:
brew install Caskroom/cask/java
【讨论】:
【参考方案21】:Grails 项目的 Spring Source Tool (STS) IDE 遇到了同样的问题。我检查了安装的 Java 版本,项目 Java 版本是 1.7.*。后来发现GGTS.ini文件中Java版本设置为1.6:
解决方案:
-Dosgi.requiredJavaVersion=1.6 改为 -Dosgi.requiredJavaVersion=1.7 在 -vmargs 之前添加以下两行 -vm jdk1.7.0_21/jre/lib/amd64/server/libjvm.so
问题解决了。编码愉快。
【讨论】:
【参考方案22】:对我来说,我在 com/sun/javadoc/Doclet
类上遇到了这个错误。经过一番挖掘,我发现我不小心将 Java 8 中的 tools.jar
复制到了我的 Java 7 文件夹中。
找到 Java 7 的 tools.jar
并将其放回文件夹解决了我的问题。所以可以尝试一下。
【讨论】:
【参考方案23】:我该如何解决?
此错误意味着用于执行您的类代码的 JRE 无法识别所使用的 Java 版本。通常是因为生成类文件(即编译它)的 Java 版本较新。
要修复它,您可以
a) 使用与运行 Java 编译器相同或更旧版本的 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
时,命令shell 解释器将从左到右查看PATH
变量中指定的所有位置,以找到要运行的适当java
运行时可执行文件。如果您安装了多个版本的 Java - 即您在 PATH 变量中指定的多个位置有 java
可执行文件,那么从左到右遇到的第一个将是执行的那个。
编译器命令为javac
,仅JDK自带。运行时命令为java
,JDK自带,在JRE中。
您可能安装了javac
的一个版本(51.0 = Java 7),并且您还安装了相同版本的java
,但另一个先前版本的java
出现在较早的版本中PATH 等正在被调用,而不是您期望的。
【讨论】:
【参考方案24】:-
单击项目中的属性。
转到 Java 构建路径。
点击添加库。
在 JRE 系统库上单击下一步。如果默认没有选择,请选择您需要的。
点击完成。
你已经完成了!
【讨论】:
【参考方案25】:如果您在构建路径中添加了第二个项目,请确保它与您的第一个项目具有相同的编译器版本: 属性 -> Java 编译器 -> 编译器合规级别
【讨论】:
【参考方案26】:正如一些人在其他地方回答的那样,Java 程序运行在比编译它的版本更旧的 Java 版本上。为了向后兼容,它需要“交叉编译”。换句话说,源 Java 版本和目标 Java 版本不匹配。
在 Eclipse 菜单中更改选项并没有回答原始发帖人,他说他/她没有使用 Eclipse。在 OpenJDK javac 版本 1.7 上,如果使用参数 -source
和 -target
,则可以交叉编译 1.6,并提供目标版本(即旧版本)的 rt.jar -file在编译时。如果实际安装的是 1.6 JRE,可以指向它的安装(例如,Ubuntu 上的 /usr/lib/jvm/java-6-openjdk-i386/jre/lib/rt.jar,/usr/jdk/jdk1.jar) 6.0_60/jre/lib/rt.jar 显然在 SunOS 上。抱歉,我不知道它在 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
【讨论】:
【参考方案27】:在 Eclipse 的菜单 Window -> Preferences -> Java -> Compiler 还要检查“配置项目特定设置”。
如果您仍然遇到相同 Java 版本的错误:尝试手动删除项目的构建文件夹。然后重启 Eclipse。
【讨论】:
【参考方案28】:哦 Mac OS X 我可以通过设置 JAVA_HOME 变量来解决这个问题:
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home
【讨论】:
【参考方案29】:我在 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
【讨论】:
【参考方案30】:我也遇到了同样的情况,但上述任何提示都没有帮助 :) 在我们的环境中,tomcat 在 Windows 上作为服务运行。我们安装了 Java 1.7 并在这个版本上设置了 JAVA_HOME。当然,源代码是基于 Java 1.7 构建的。尽管如此,tomcat 说它使用以前版本的 JVM。经过深入分析后发现,安装在 Windows 上的 Tomcat 服务仍然保持 JAVA_HOME 指向 Java 1.6 的旧值。安装新的 Tomcat 服务后,一切都解决了。 所以结论是:当你改变java版本和tomcat作为服务运行时,你必须重新安装tomcat服务。
【讨论】:
以上是关于如何修复 java.lang.UnsupportedClassVersionError:不支持的 major.minor 版本的主要内容,如果未能解决你的问题,请参考以下文章