Java 17+Gradle 7.6环境执行Gradle Wrapper失败,报Unsupported class file major version 65(Java 21版本)错误
我之前也碰到过几乎一模一样的问题,这个报错的核心原因其实很明确:Jackson 2.15.x系列开始使用了多版本JAR(Multi-Release JAR)格式,里面包含了针对Java 21编译的class文件(对应major version 65),而你当前使用的Gradle 7.6的内部ASM库版本不支持解析这种高版本的class文件——哪怕你实际运行环境是Java 17,Gradle在处理依赖JAR时会扫描所有版本的class文件,从而触发这个兼容性错误。
下面给你几个经过验证的可行解决方法:
方法一:降级Jackson依赖到2.14.x系列
Jackson 2.14.x及以下版本的JAR包中不包含Java 21的class文件,完全适配Java 17和Gradle 7.6。你需要在项目的build.gradle(或build.gradle.kts)中强制指定Jackson相关依赖的版本:
// Groovy DSL 示例 configurations.all { resolutionStrategy { // 强制所有依赖使用Jackson 2.14.3(稳定版) force 'com.fasterxml.jackson.core:jackson-core:2.14.3' force 'com.fasterxml.jackson.core:jackson-databind:2.14.3' force 'com.fasterxml.jackson.core:jackson-annotations:2.14.3' // 如果用到了jackson其他模块(如jackson-dataformat-json等),也需要同步降级 } }
之后执行清理和构建命令,同时可以手动清理本地Jackson缓存确保生效:
rm -rf ~/.gradle/caches/modules-2/files-2.1/com.fasterxml.jackson.core/ gradle clean build
方法二:升级Gradle到兼容版本
Gradle 7.6.2(7.x系列的最新补丁版)和Gradle 8.0及以上版本,已经更新了内部ASM库以支持Java 21的class文件解析。如果你不想降级Jackson,可以选择升级Gradle:
- 手动修改项目根目录下的
gradle/wrapper/gradle-wrapper.properties,更新distributionUrl:# 示例:升级到7.6.2(兼容Java 17且修复了该问题) distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.2-bin.zip - 重新生成Wrapper并验证:
gradle wrapper --gradle-version 7.6.2 ./gradlew build
方法三:排查并阻断高版本Jackson的传递依赖
先通过Gradle命令找出哪个第三方依赖引入了Jackson 2.15.4:
gradle dependencies --configuration compileClasspath | grep jackson-core
找到对应的依赖后,在build.gradle中直接排除它的高版本Jackson依赖,同时指定兼容版本:
// 示例:假设是spring-boot-starter-web引入了高版本Jackson dependencies { implementation('org.springframework.boot:spring-boot-starter-web') { exclude group: 'com.fasterxml.jackson.core', module: 'jackson-core' exclude group: 'com.fasterxml.jackson.core', module: 'jackson-databind' exclude group: 'com.fasterxml.jackson.core', module: 'jackson-annotations' } // 手动引入兼容版Jackson implementation 'com.fasterxml.jackson.core:jackson-core:2.14.3' implementation 'com.fasterxml.jackson.core:jackson-databind:2.14.3' implementation 'com.fasterxml.jackson.core:jackson-annotations:2.14.3' }
另外你提到删除.gradle目录后还是报错,这是因为删除缓存只是重新拉取依赖,但Jackson 2.15.4本身的多版本JAR特性依然存在,所以必须从依赖版本或Gradle版本的兼容性入手解决。
内容来源于stack exchange

