Unsupported class file major version 65 是什么问题?本文整理 Java class major version 对照表,包括 Java 8=52、Java 11=55、Java 17=61、Java 21=65、Java 25=69、Java 26=70,并提供 Maven、Gradle、IDEA 中的解决办法。

最后更新:2026-05-14
适用场景:Java版本不兼容、JDK版本过低、Maven编译失败、Gradle构建失败、IDEA运行报错、Spring Boot启动失败

Java 项目中经常会遇到下面这种报错:

Unsupported class file major version 65

或者:

java.lang.UnsupportedClassVersionError:
xxx has been compiled by a more recent version of the Java Runtime

这类错误本质上都是一句话:

当前运行环境的 JDK 版本太低,无法识别更高版本 JDK 编译出来的 class 文件。

比如:

major version 52 = JDK 8
major version 55 = JDK 11
major version 61 = JDK 17
major version 65 = JDK 21
major version 69 = JDK 25
major version 70 = JDK 26

如果你看到 Unsupported class file major version 65,通常说明某个 class 文件是用 JDK 21 编译的,但你当前运行或构建环境使用的 JDK 版本低于 21。

Java SE 26 的 JVM 规范明确说明,Java SE 26 支持 class file major version 45 到 70,并且规范表格列出了 Java SE 8 对应 52、Java SE 11 对应 55、Java SE 17 对应 61、Java SE 21 对应 65、Java SE 25 对应 69、Java SE 26 对应 70。([Oracle 文档][1])


一、Java major version 对照表

先放最常用的版本对照表。

class major version对应Java版本常见程度说明
52Java 8非常常见老项目、传统企业项目常见
55Java 11常见过渡期项目、部分微服务项目常见
61Java 17非常常见Spring Boot 3.x 主流版本
65Java 21越来越常见新项目、虚拟线程相关项目常见
69Java 25新版本JDK 25 LTS 对应版本
70Java 26新版本JDK 26 对应版本

完整对照表如下:

Java版本class major version
Java 1.145
Java 1.246
Java 1.347
Java 1.448
Java 549
Java 650
Java 751
Java 852
Java 953
Java 1054
Java 1155
Java 1256
Java 1357
Java 1458
Java 1559
Java 1660
Java 1761
Java 1862
Java 1963
Java 2064
Java 2165
Java 2266
Java 2367
Java 2468
Java 2569
Java 2670

记不住也没关系,只需要记住几个常见版本:

Java 8  -> 52
Java 11 -> 55
Java 17 -> 61
Java 21 -> 65
Java 25 -> 69
Java 26 -> 70

JDK 25 已在 2025-09-16 GA,OpenJDK 页面也说明 JDK 25 会被多数厂商作为 LTS 版本;Oracle 的 JDK 26 发布说明显示 JDK 26 的发布日期为 2026-03-17。([OpenJDK][2])


二、Unsupported class file major version 是什么意思?

常见报错有几种写法。

1. Gradle常见报错

Unsupported class file major version 65

这通常表示:

Gradle、Gradle插件或项目依赖中有 class 文件使用 JDK21 编译,
但当前 Gradle 运行环境或插件解析环境不支持这个版本。

2. Java运行时常见报错

java.lang.UnsupportedClassVersionError:
com/example/Demo has been compiled by a more recent version of the Java Runtime

完整一点可能是:

com/example/Demo has been compiled by a more recent version of the Java Runtime
(class file version 65.0), this version of the Java Runtime only recognizes class file versions up to 61.0

这句话翻译成人话就是:

Demo 这个类是 JDK21 编译出来的,class version 是 65;
但你当前运行环境最多只认识 class version 61,也就是 JDK17。

解决办法:

1. 升级运行环境 JDK 到 21 或更高
2. 或者把项目编译目标降到 JDK17

三、看到 major version 后怎么判断问题?

可以按下面这张表快速判断。

报错含义解决方向
major version 52class由JDK8编译用JDK8或更高版本运行
major version 55class由JDK11编译用JDK11或更高版本运行
major version 61class由JDK17编译用JDK17或更高版本运行
major version 65class由JDK21编译用JDK21或更高版本运行
major version 69class由JDK25编译用JDK25或更高版本运行
major version 70class由JDK26编译用JDK26或更高版本运行

最常见的几个场景:

JDK17运行JDK21编译的项目 -> 报 major version 65
JDK11运行JDK17编译的项目 -> 报 major version 61
JDK8运行JDK11编译的项目  -> 报 major version 55
JDK21运行JDK25编译的项目 -> 报 major version 69

原则很简单:

高版本 JDK 通常可以运行低版本 class 文件;
低版本 JDK 不能运行高版本 class 文件。

比如:

JDK21 可以运行 JDK8 / 11 / 17 编译出来的 class
JDK17 不能运行 JDK21 编译出来的 class
JDK8 不能运行 JDK11 / 17 / 21 编译出来的 class

四、先检查你当前到底用了哪个JDK

很多人以为自己用了 JDK17,实际命令行、IDEA、Maven、Gradle 用的可能不是同一个 JDK。

1. 检查命令行Java版本

java -version

示例:

openjdk version "17.0.10"

再检查 javac:

javac -version

示例:

javac 17.0.10

如果 java -version 是 17,但 javac -version 不存在,说明你可能只装了 JRE,或者环境变量没有配置好。


2. 检查Maven使用的JDK

mvn -version

重点看输出里的 Java version:

Apache Maven 3.9.x
Java version: 17.0.x

如果这里显示的是 JDK8,而你的项目需要 JDK17 或 JDK21,就很容易出现编译或运行问题。


3. 检查Gradle使用的JDK

Linux / macOS:

./gradlew --version

Windows:

gradlew.bat --version

重点看:

Gradle
JVM
OS

如果 JVM 显示的是 Java 8,但项目使用了 Java 17 或 Java 21,就要调整 Gradle JVM。


4. 检查IDEA中的JDK

IntelliJ IDEA 至少有几个地方会影响 JDK:

File > Project Structure > Project > SDK
File > Project Structure > Modules > Dependencies > Module SDK
Settings > Build Tools > Maven > Runner > JRE
Settings > Build Tools > Gradle > Gradle JVM

很多时候命令行是 JDK17,但 IDEA 里还是 JDK8,或者 Gradle JVM 还是 JDK11,这就会导致:

命令行能跑,IDEA不能跑
IDEA能跑,命令行不能跑
Maven能编译,Gradle不能编译

五、如何查看某个class文件的major version?

可以用 javap 查看。

假设有一个 class 文件:

target/classes/com/example/Demo.class

执行:

javap -verbose target/classes/com/example/Demo.class | grep "major"

Windows PowerShell 可以用:

javap -verbose target/classes/com/example/Demo.class | Select-String "major"

输出示例:

major version: 61

说明这个 class 文件是 Java 17 编译出来的。

如果输出:

major version: 65

说明它是 Java 21 编译出来的。

如果输出:

major version: 69

说明它是 Java 25 编译出来的。


六、Maven项目怎么解决?

Maven 项目最常见的问题是:

当前运行 Maven 的 JDK 版本
项目设置的编译版本
实际运行项目的 JDK 版本

这三个不一致。

1. 推荐使用 maven.compiler.release

如果项目要编译成 Java 17,建议在 pom.xml 中写:

<properties>
    <maven.compiler.release>17</maven.compiler.release>
</properties>

如果项目要编译成 Java 21:

<properties>
    <maven.compiler.release>21</maven.compiler.release>
</properties>

Maven Compiler Plugin 官方文档说明,JDK 9 开始 javac 支持 --release 参数,用来指定目标 Java SE 版本;它不仅会生成对应版本的 class 文件,还会按目标版本的公开 API 进行编译检查。([Apache Maven][3])

这比只写 sourcetarget 更稳。


2. 老项目也可以使用 source / target

老项目常见写法:

<properties>
    <maven.compiler.source>8</maven.compiler.source>
    <maven.compiler.target>8</maven.compiler.target>
</properties>

或者:

<properties>
    <maven.compiler.source>17</maven.compiler.source>
    <maven.compiler.target>17</maven.compiler.target>
</properties>

但如果你使用的是 JDK9 以上,更推荐:

<properties>
    <maven.compiler.release>17</maven.compiler.release>
</properties>

3. Maven报 major version 65 的处理方法

如果你看到:

Unsupported class file major version 65

先执行:

mvn -version

如果输出中 Java version 是 17,但项目或依赖需要 Java 21,那么有两个选择。

选择一:升级 Maven 使用的 JDK 到 21。

JAVA_HOME 指向 JDK21
PATH 中优先使用 JDK21/bin
IDEA Maven Runner JRE 改成 JDK21

选择二:把项目编译目标降到 17。

<properties>
    <maven.compiler.release>17</maven.compiler.release>
</properties>

注意:如果你的代码或依赖已经使用了 Java 21 才有的 API,单纯降级编译版本可能会失败。这时应该升级运行环境,而不是强行降级。


七、Gradle项目怎么解决?

Gradle 项目建议使用 Java Toolchain。

1. Groovy DSL:build.gradle

如果项目需要 Java 17:

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(17)
    }
}

如果项目需要 Java 21:

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(21)
    }
}

Gradle 官方文档说明,JVM 项目可以通过 Java Toolchains 配置编译和运行项目所需的 Java 版本,并给出了 languageVersion = JavaLanguageVersion.of(17) 这种写法。([Gradle 文档][4])


2. Kotlin DSL:build.gradle.kts

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(17)
    }
}

Java 21 项目:

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(21)
    }
}

3. 老项目使用 sourceCompatibility / targetCompatibility

老项目可能是这样写的:

sourceCompatibility = '1.8'
targetCompatibility = '1.8'

或者:

sourceCompatibility = '17'
targetCompatibility = '17'

可以继续用,但新项目更建议使用 toolchain。


4. Gradle报 major version 65 的处理方法

如果 Gradle 报:

Unsupported class file major version 65

常见原因有 4 个:

1. 当前 Gradle JVM 版本太低
2. Gradle版本太老,不支持当前JDK
3. Gradle插件版本太老,不支持当前class版本
4. 项目依赖使用了更高版本JDK编译

排查顺序:

./gradlew --version

看 JVM 是多少。

如果 JVM 是 17,但项目插件或依赖需要 21,可以把 Gradle JVM 改成 JDK21。

IDEA 中检查:

Settings > Build Tools > Gradle > Gradle JVM

命令行中检查:

echo $JAVA_HOME
java -version

Windows PowerShell:

echo $env:JAVA_HOME
java -version

八、IDEA中怎么解决?

如果你在 IDEA 里遇到 major version 报错,优先检查这几个地方。

1. Project SDK

File > Project Structure > Project > SDK

如果项目是 Java 17,就选 JDK17。

如果项目是 Java 21,就选 JDK21。


2. Module SDK

File > Project Structure > Modules > Dependencies > Module SDK

多模块项目尤其要检查这里。

有些项目主模块是 JDK17,legacy 模块是 JDK8,如果配置错了,就会出现奇怪的编译错误。


3. Maven Runner JRE

Settings > Build Tools > Maven > Runner > JRE

如果 Maven 编译时报错,要检查这里是不是选错了 JDK。

建议选择:

Project JDK

或者直接指定项目需要的 JDK,例如:

JDK17
JDK21

4. Gradle JVM

Settings > Build Tools > Gradle > Gradle JVM

Gradle 项目一定要看这里。

很多时候 Project SDK 是 JDK17,但 Gradle JVM 还是 JDK8 或 JDK11,结果 Gradle 同步时直接报错。


九、常见场景与解决办法

场景1:JDK17运行JDK21编译的项目

报错:

class file version 65.0, this version of the Java Runtime only recognizes class file versions up to 61.0

解释:

65 = Java 21
61 = Java 17

解决:

升级运行环境到 JDK21

或者把项目编译目标改成 JDK17:

Maven:

<properties>
    <maven.compiler.release>17</maven.compiler.release>
</properties>

Gradle:

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(17)
    }
}

场景2:JDK8运行JDK11编译的项目

报错中可能出现:

class file version 55.0

解释:

55 = Java 11
52 = Java 8

解决:

升级运行环境到 JDK11 或更高

如果项目必须运行在 JDK8,就把编译目标改成 8。

Maven:

<properties>
    <maven.compiler.release>8</maven.compiler.release>
</properties>

Gradle:

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(8)
    }
}

场景3:Maven明明配置了JDK17,还是报错

先检查 Maven 实际用的 JDK:

mvn -version

然后检查 IDEA 的 Maven Runner:

Settings > Build Tools > Maven > Runner > JRE

再检查 pom.xml

<properties>
    <maven.compiler.release>17</maven.compiler.release>
</properties>

如果这些都没问题,再考虑是不是某个依赖或插件本身使用了更高版本 JDK 编译。


场景4:Gradle插件报 major version 65

如果是插件报错,比如:

Unsupported class file major version 65

不一定是你业务代码的问题,也可能是 Gradle 插件版本太老,无法处理 Java 21 的 class 文件。

解决方向:

1. 升级 Gradle Wrapper
2. 升级相关 Gradle 插件
3. 把 Gradle JVM 改成更高版本 JDK
4. 检查项目是否误用了过高版本依赖

查看 Gradle 版本:

./gradlew --version

查看 Wrapper 配置:

gradle/wrapper/gradle-wrapper.properties

场景5:Lombok、ASM、Byte Buddy 等工具报错

有时候报错不是 Java 运行时本身,而是一些字节码处理工具不认识新的 class major version。

常见相关工具包括:

Lombok
ASM
Byte Buddy
Jacoco
SpotBugs
Sonar
Spring Boot Maven Plugin
Gradle Plugin

解决方法通常是:

升级对应插件或依赖版本

比如:

升级 Lombok
升级 Gradle 插件
升级 Maven 插件
升级 Jacoco
升级 Byte Buddy
升级 Spring Boot 版本

如果你刚把 JDK 从 17 升到 21,或者从 21 升到 25,这类问题很常见。


十、source、target、release 有什么区别?

Maven 和 javac 里经常看到这几个概念:

source
target
release

简单理解:

参数作用
source指定源码语法版本
target指定生成的 class 文件版本
release同时限制语法、class版本和目标平台API

例如:

<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>

表示:

源码按 Java 8 语法编译
生成 Java 8 可识别的 class 文件

但它不一定能防止你误用更高版本 JDK 的 API。

所以 JDK9 以后更推荐:

<maven.compiler.release>8</maven.compiler.release>

或者:

<maven.compiler.release>17</maven.compiler.release>

这样更稳。


十一、为什么高版本JDK可以运行低版本class?

因为 Java 有向后兼容设计。

例如:

JDK21 可以运行 Java 8 编译出来的 class 文件
JDK17 可以运行 Java 11 编译出来的 class 文件
JDK11 可以运行 Java 8 编译出来的 class 文件

但反过来不行:

JDK8 不能运行 Java 11 编译出来的 class 文件
JDK11 不能运行 Java 17 编译出来的 class 文件
JDK17 不能运行 Java 21 编译出来的 class 文件

所以遇到 major version 报错时,优先判断:

当前运行JDK版本 < class文件编译JDK版本

如果是,那就升级运行 JDK,或者降低编译目标。


十二、preview features 和 minor version 65535 是什么?

一般我们看到的是:

major version: 65

但 class 文件其实还有 minor version。

Java SE 26 的 JVM 规范说明,Java SE 12 以后,如果 class 文件使用了某个版本的 preview features,它的 minor version 会是 65535,并且这类 class 文件只能在对应 Java 版本开启 preview 的情况下加载。([Oracle 文档][1])

简单说:

65.0     = 普通 Java 21 class 文件
65.65535 = 使用 Java 21 preview features 的 class 文件

如果你用了 preview feature,运行时通常还需要加:

--enable-preview

例如:

java --enable-preview -jar app.jar

Maven 或 Gradle 也要对应开启 preview 编译参数。

普通项目不建议随便开启 preview features,尤其是生产项目。


十三、最终排查清单

遇到 Unsupported class file major version,按这个顺序查。

1. 先查报错里的 major version

52 -> Java 8
55 -> Java 11
61 -> Java 17
65 -> Java 21
69 -> Java 25
70 -> Java 26

2. 查当前命令行JDK

java -version
javac -version

3. 查Maven JDK

mvn -version

4. 查Gradle JDK

./gradlew --version

5. 查IDEA配置

Project SDK
Module SDK
Maven Runner JRE
Gradle JVM

6. 查项目编译配置

Maven:

<properties>
    <maven.compiler.release>17</maven.compiler.release>
</properties>

Gradle:

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(17)
    }
}

7. 查插件和依赖版本

重点检查:

Lombok
ASM
Byte Buddy
Jacoco
Spring Boot
Maven Compiler Plugin
Gradle Plugin
Android Gradle Plugin

十四、FAQ

1. Unsupported class file major version 65 是 JDK 几?

major version 65 = Java 21

说明某个 class 文件是用 JDK21 编译的。

如果你当前使用 JDK17 或更低版本运行,就会报错。


2. Unsupported class file major version 61 是 JDK 几?

major version 61 = Java 17

常见于用 JDK8 或 JDK11 运行 Java 17 项目。


3. Unsupported class file major version 69 是 JDK 几?

major version 69 = Java 25

如果你使用 JDK21 或更低版本运行 Java 25 编译的 class 文件,就可能遇到这个错误。


4. Unsupported class file major version 70 是 JDK 几?

major version 70 = Java 26

通常说明代码、依赖或插件中出现了 JDK26 编译出来的 class 文件。


5. 能不能用 JDK17 编译出 JDK8 能运行的代码?

可以,但要正确设置编译目标。

Maven 推荐:

<properties>
    <maven.compiler.release>8</maven.compiler.release>
</properties>

Gradle 可以配置 toolchain 或 release 参数。

但注意:如果你的代码用了 Java 9、Java 11、Java 17 才有的 API,就无法直接编译成 Java 8 可运行版本。


6. 我配置了 JAVA_HOME,为什么 IDEA 还是报错?

因为 IDEA 不一定使用系统的 JAVA_HOME

你还要检查:

Project SDK
Module SDK
Maven Runner JRE
Gradle JVM

尤其是 Gradle 项目,很多时候问题出在:

Settings > Build Tools > Gradle > Gradle JVM

7. 这是JDK问题还是依赖问题?

都有可能。

如果是你自己的代码报错,通常是 JDK 版本不一致。

如果是插件、框架、构建工具报错,可能是:

插件版本太老
依赖版本太新
构建工具不支持当前JDK
字节码处理库不认识新的class版本

这时不一定要改业务代码,可能只需要升级插件。


十五、我的建议

普通 Java 项目建议这样选:

老项目:按项目要求使用 JDK8 或 JDK11
当前主流项目:优先 JDK17 或 JDK21
新项目:可以评估 JDK25
尝鲜测试:可以使用 JDK26

团队项目建议统一:

1. 统一 JDK 大版本
2. 统一 JDK 发行版
3. 统一 Maven / Gradle 编译版本
4. 统一 IDEA 项目配置
5. CI/CD 中打印 java -version、mvn -version、gradle --version

构建脚本里可以加:

java -version
mvn -version
./gradlew --version

这样以后排查环境问题会省很多时间。


十六、相关文章

如果你还没有安装或下载 JDK,可以先看:

各版本JDK镜像下载地址:JDK8 / JDK11 / JDK17 / JDK21 / JDK25 / JDK26 下载与IDEA配置指南

如果 Maven 下载依赖很慢,可以看:

Maven国内镜像settings.xml配置大全:阿里云、腾讯云、华为云、清华源

如果 Gradle 下载依赖或插件很慢,可以看:

Gradle国内镜像配置教程:init.gradle、repositories与Wrapper加速完整指南


更新记录

2026-05-14:
- 增加 Java 25 / class major version 69
- 增加 Java 26 / class major version 70
- 增加 Maven maven.compiler.release 配置示例
- 增加 Gradle toolchain 配置示例
- 增加 IDEA、Maven、Gradle 排查步骤
- 增加 preview features 与 minor version 65535 说明
- 增加 Unsupported class file major version 常见FAQ