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版本 | 常见程度 | 说明 |
|---|---|---|---|
| 52 | Java 8 | 非常常见 | 老项目、传统企业项目常见 |
| 55 | Java 11 | 常见 | 过渡期项目、部分微服务项目常见 |
| 61 | Java 17 | 非常常见 | Spring Boot 3.x 主流版本 |
| 65 | Java 21 | 越来越常见 | 新项目、虚拟线程相关项目常见 |
| 69 | Java 25 | 新版本 | JDK 25 LTS 对应版本 |
| 70 | Java 26 | 新版本 | JDK 26 对应版本 |
完整对照表如下:
| Java版本 | class major version |
|---|---|
| Java 1.1 | 45 |
| Java 1.2 | 46 |
| Java 1.3 | 47 |
| Java 1.4 | 48 |
| Java 5 | 49 |
| Java 6 | 50 |
| Java 7 | 51 |
| Java 8 | 52 |
| Java 9 | 53 |
| Java 10 | 54 |
| Java 11 | 55 |
| Java 12 | 56 |
| Java 13 | 57 |
| Java 14 | 58 |
| Java 15 | 59 |
| Java 16 | 60 |
| Java 17 | 61 |
| Java 18 | 62 |
| Java 19 | 63 |
| Java 20 | 64 |
| Java 21 | 65 |
| Java 22 | 66 |
| Java 23 | 67 |
| Java 24 | 68 |
| Java 25 | 69 |
| Java 26 | 70 |
记不住也没关系,只需要记住几个常见版本:
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 52 | class由JDK8编译 | 用JDK8或更高版本运行 |
| major version 55 | class由JDK11编译 | 用JDK11或更高版本运行 |
| major version 61 | class由JDK17编译 | 用JDK17或更高版本运行 |
| major version 65 | class由JDK21编译 | 用JDK21或更高版本运行 |
| major version 69 | class由JDK25编译 | 用JDK25或更高版本运行 |
| major version 70 | class由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])
这比只写 source 和 target 更稳。
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
Java版本号与class文件major version对照表:Unsupported class file major version 52 / 55 / 61 / 65 / 69 / 70
https://java.li/archives/yihCUL2o
评论