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

Posted

技术标签:

【中文标题】如何修复 java.lang.UnsupportedClassVersionError:不支持的 major.minor 版本【英文标题】:How to fix java.lang.UnsupportedClassVersionError: Unsupported major.minor version 【发布时间】:2021-02-08 12:24:18 【问题描述】:

我正在尝试使用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】:

别担心,我已经解决了。

其实很简单——你需要安装相同版本的 BOTH JRE / JDK。

JRE 6 -> JDK 6

JRE 7 -> JDK 7

等等。

【讨论】:

java 7 也可以处理 6 没有任何问题。 @damienix 您可能希望指定 Java 7 JRE 可以毫无问题地处理 Java 6 编译类,否则您的声明会导致混淆。【参考方案2】:

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

【讨论】:

+1: 将此符号链接 (/etc/alternatives/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-alternatives --config java 来这样做。【参考方案3】:

显示的版本号描述了类文件兼容的 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 的不同工作区复制项目后:(【参考方案4】:

此错误表示您正在尝试加载一个 Java“类”文件,该文件是使用比您安装的新版本的 Java 编译的。

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

所以解决方案是:

升级您的 Java 运行时或

如果您有源代码,请使用本地 Java 编译器(如果您有的话)重新编译该类。

javac 文件名.java

对于开发人员,如果其他开发人员签入 .class 文件,并且他们的 java 版本比您的更新,就会发生这种情况!

【讨论】:

【参考方案5】:

在 Eclipse 中,我只是转到菜单命令 Window -> Preferences -> Java -> Compiler然后将“编译器合规级别”设置为 1.6。

【讨论】:

在 Eclipse 中,有时项目方面也需要更改为适当的 java 版本。 谢谢。值得注意的是,设置 Eclipse 的默认执行环境(构建路径上的 JRE)是一个单独的设置。我设置了 JRE,但没有设置编译器合规级别;这解决了它。 您是如何从错误消息中得出结论认为这是设置选项的正确位置? 如果您正在使用 ant 和 eclipse,也许这个:***.com/questions/7073485/… 会有所帮助。 问题是关于 Notepad++ 而不是 Eclipse。【参考方案6】:

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

【讨论】:

【参考方案7】:

在 Eclipse 的菜单 Window -> Preferences -> Java -> Compiler 还检查​​“配置项目特定设置”。

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

【讨论】:

【参考方案8】:

正如一些人在其他地方回答的那样,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

【讨论】:

【参考方案9】:

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

如你所愿

Unsupported major.minor version 51.0

并且版本 51.0 对应于 J2SE 7 您很可能已经在 J​​ava 7 中编译了代码并尝试使用较低版本运行它。检查java -version 显示的内容。它应该是 Java 7 版本。如果没有在 PATH/JAVA_HOME 中进行适当的更改。或者您可以使用您尝试运行代码的相同版本进行编译。如果配置令人困惑,您始终可以提供绝对路径 /home/user/jdk1.7.0_11/bin/javac/home/user/jdk1.7.0_11/bin/java

【讨论】:

【参考方案10】:

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

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

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

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

这对我来说解决了不受支持的主要小问题。

【讨论】:

【参考方案11】:

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

【讨论】:

【参考方案12】:

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

【讨论】:

【参考方案13】:

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

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

转到:运行 -> 外部工具 -> 外部工具配置 ... 为您的项目选择 Ant build.xml(如果您有多个项目) 激活选项卡“JRE” 此处选择了“单独的 JRE:jre6”。当我将它从 1.6 或 1.7 系列更改为 JDK 时,错误消失了。

【讨论】:

【参考方案14】:

如果您在使用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,请将 sourcetarget 设置为 1.8

【讨论】:

一个关于如何使用插件交叉编译的sn-p会非常好,而不是访问/打开链接【参考方案15】:

首先让我们了解一些基础知识...

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

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

因此,当您将默认库作为 JRE 而不是 JDK 时,您会很开心地导入东西,但它不会编译。

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

【讨论】:

【参考方案16】:

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

/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 (unable to load class 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版本“1.6.0_27”

这会导致“Unsupported major.minor version 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”

【讨论】:

【参考方案17】:

当我恢复到 Java 6 并尝试运行以前用 Java 7 编译的类时遇到了这个问题。对我有用的是 Preferences > java > compiler --> 将合规级别设置为 1.6 并至关重要地“配置项目设置”..

【讨论】:

【参考方案18】:

基于此...

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

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

下:

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

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

【讨论】:

【参考方案19】:

我遇到了一个问题,即我必须从命令行对我的项目运行 Maven 编译才能运行我的单元测试;如果我对测试类进行了更改并让 Eclipse 自动重新编译它,则会出现“Unsupported major.minor version 51.0”错误。

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

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

【讨论】:

【参考方案20】:

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

【讨论】:

【参考方案21】: 安装 JDK 7.0.55 并为 JDK 7.0.55 设置 Eclipse 的 Java。 通过在构建路径 JDK 7.0.55 上配置,使用 JDK 7.0.55 构建项目。 在 Eclipse 中通过菜单 Windows -> Preferences -> Java -> Compiler 为 JDK 7.0.55 设置编译器/em> - 选择 1.7。

【讨论】:

【参考方案22】:

我解决了。我跑了:

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 及更高版本)。`

【讨论】:

【参考方案23】:

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

我在 Eclipse 中的解决方案:

右键单击您的项目Properties -> Java Build Path -> Libraries

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

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

这对我有用。

【讨论】:

【参考方案24】:

我遇到了同样的问题,我在 Mac 上通过 this solution 解决了这个问题。我希望它可以帮助某人。因为系统不知道JDK的较新版本,还是指向旧的JDK。

【讨论】:

【参考方案25】:

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

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

javac -version

java -version

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

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

which javac 会告诉您位置,例如/usr/bin/javac。直接使用/usr/bin/java &lt;program&gt;运行即可。

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

【讨论】:

【参考方案26】:

我也遇到了同样的情况,但上述任何提示都没有帮助 :) 在我们的环境中,tomcat 在 Windows 上作为服务运行。我们安装了 Java 1.7 并在这个版本上设置了 JAVA_HOME。当然,源代码是基于 Java 1.7 构建的。尽管如此,tomcat 说它使用以前版本的 JVM。经过深入分析后发现,安装在 Windows 上的 Tomcat 服务仍然保持 JAVA_HOME 指向 Java 1.6 的旧值。安装新的 Tomcat 服务后,一切都解决了。 所以结论是:当你改变java版本和tomcat作为服务运行时,你必须重新安装tomcat服务。

【讨论】:

【参考方案27】:

我该如何解决?

此错误意味着用于执行您的类代码的 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 等正在被调用,而不是您期望的。

【讨论】:

【参考方案28】:

最常见的问题是您的 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 时,此答案对我有用。【参考方案29】:

哦 Mac OS X 我可以通过设置 JAVA_HOME 变量来解决这个问题:

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

【讨论】:

【参考方案30】:

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

问题解决了。编码愉快。

【讨论】:

以上是关于如何修复 java.lang.UnsupportedClassVersionError:不支持的 major.minor 版本的主要内容,如果未能解决你的问题,请参考以下文章

如何修复漏洞

如何修复WMI

PHP网站漏洞怎么修复 如何修补网站程序代码漏洞

如何修复这些漏洞? (npm audit fix 无法修复这些漏洞)

如何修复AppScan漏洞

如何在DOS环境下修复系统