如何修复 java.lang.UnsupportedClassVersionError:完整指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:为您的 Java 代码准备的“时间机器”

\n

想象一下:您下载了一个很棒的库,写了几行代码,然后点击“运行”——但您看到的不是运行中的程序,而是一条冗长、令人恐慌的消息:

\n
Exception in thread "main" java.lang.UnsupportedClassVersionError: \ncom/example/MyApp has been compiled by a more recent version of the Java Runtime \n(class file version 61.0), this version of the Java Runtime only recognizes \nclass file versions up to 55.0
\n

熟悉吗?如果您曾经遇到过 java.lang.UnsupportedClassVersionError,您就会知道这就像两个人在说不同的语言。您的 Java 程序说的是版本 61.0(Java 17),而运行时环境只能理解最高版本 55.0(Java 11)。

\n

在本教程中,我们将详细解释什么是 Unsupported major.minor version,它为什么会发生,以及最重要的是,如何修复它。我们不仅会提供现成的解决方案,还会教您理解问题的根源。我们开始吧!

\n\n

什么是 major.minor version?简要说明

\n

Java 中的每个 .class 文件都有一个内部标记——major.minor version。这是由 javac 编译器创建的字节码格式版本号。例如:

\n
    \n
  • major 52 → Java 8
  • \n
  • major 55 → Java 11
  • \n
  • major 61 → Java 17
  • \n
  • major 65 → Java 21
  • \n
\n

当您运行应用程序时,JRE(Java 运行时环境)会检查它是否能“理解”这个文件。如果文件的版本比 JRE 的版本更新,您就会遇到 java.lang.UnsupportedClassVersionError。

\n

一个简单的类比:想象一下,您试图在 Adobe Reader 2010 中打开一个用 Adobe Acrobat 2023 创建的 PDF 文档。程序会说:“我不认识这种格式。”

\n\n

UnsupportedClassVersionError 错误的主要原因

\n

Unsupported major.minor version 错误可能由多种原因引起:

\n
    \n
  • JDK 和 JRE 版本不同:您使用 JDK 17 编译了代码,但使用 JRE 11 运行它。
  • \n
  • 第三方库:您引入了一个为 Java 17 编译的 JAR 文件,但您的运行时环境是 Java 8。
  • \n
  • Maven/Gradle 配置错误:构建文件中指定了一个 Java 版本,但服务器上安装了另一个版本。
  • \n
  • 部署到旧服务器:您在最新的 IDE 上开发,但生产服务器运行的是过时的 Java 版本。
  • \n
\n\n

逐步教程:如何修复错误

\n

让我们详细分析解决问题的具体步骤。我们将讨论三种主要场景。

\n\n

步骤 1:检查 Java 版本

\n

首先,您需要弄清楚“罪魁祸首”是谁。打开终端并执行:

\n
# 您用于编译的版本(JDK)\njavac -version\n\n# 您用于运行的版本(JRE)\njava -version
\n

如果它们不匹配——这就是原因。例如,javac 显示“17.0.1”,而 java 显示“11.0.12”。

\n

解决方案:安装相同的版本,要么更新 JRE,要么降低编译版本(如下所述)。

\n\n

步骤 2:修复编译设置

\n

如果您无法更新 JRE(例如在服务器上),则需要为更旧的版本编译代码。在编译器中使用 -source 和 -target 标志:

\n
// 使用 Java 17 语法编译,但生成针对 Java 11 的字节码\njavac -source 17 -target 11 MyApp.java
\n

重要提示: -source 指定您使用的 Java 语法,而 -target 指定生成 .class 文件所针对的 JRE 版本。如果您的代码使用了 Java 17 的特性(例如 switch 表达式),它们将被编译成兼容的字节码。

博客

书籍推荐