Gradle构建shadowJar遇Unsupported class file major version 63问题排查
问题分析
环境配置
Gradle版本信息
> ./gradlew --version ------------------------------------------------------------ Gradle 6.1.1 ------------------------------------------------------------ Kotlin: 1.3.61 Groovy: 2.5.8 Ant: Apache Ant(TM) version 1.10.7 compiled on September 1 2019 JVM: 11.0.18
Shadow插件配置(build.gradle中)
dependencies { // ... classpath "com.github.jengelman.gradle.plugins:shadow:6.1.0" // ... }
问题现象
根据Shadow插件兼容性表,Gradle 6.1.1、Shadow 6.1.0与Java 11应当兼容,但执行./gradlew build shadowJar时抛出错误:
2023-08-03T14:54:20.719-0700 [ERROR] [com.github.jengelman.gradle.plugins.shadow.tasks.ShadowCopyAction] ex java.lang.IllegalArgumentException: Unsupported class file major version 63
已知版本63对应Java 19,但本地./gradlew与java --version均显示使用Java 11.0.18。
错误来源分析
出现该错误的核心原因是构建过程中存在Java 19编译的类文件,而当前运行Shadow插件的Java 11环境无法识别该版本类文件,具体场景包括:
项目残留旧编译产物
之前可能用Java 19构建过项目,build目录下残留了高版本编译的.class文件。Gradle增量构建机制未清理这些文件,导致Shadow插件处理时读取到不兼容的类文件。第三方依赖使用Java 19编译
项目引入的依赖库中,存在用Java 19编译的包。这类库的class文件版本为63,Java 11的JVM无法解析该格式。Gradle实际运行JVM与显示版本不一致
- 检查
gradle.properties中的org.gradle.java.home配置,若该路径指向Java 19,即使./gradlew --version显示Java 11,实际编译阶段仍会生成高版本类文件,后续Shadow插件处理时出错。 - 系统环境变量
JAVA_HOME指向Java 19,部分Gradle任务会优先读取该变量,导致编译出高版本类文件,与Shadow插件的运行环境冲突。
- 检查
排查建议
- 执行
./gradlew clean清理所有构建产物,再重新运行./gradlew build shadowJar,排除旧编译文件残留问题。 - 检查
gradle.properties文件,确认org.gradle.java.home配置指向Java 11的安装路径,修正错误配置。 - 验证系统环境变量
JAVA_HOME,确保其指向Java 11,必要时临时修改后重新执行构建。 - 排查项目依赖,通过
javap -v <类文件> | grep major命令查看依赖类文件的版本,确认是否存在Java 19编译的库,若有则替换为兼容Java 11的版本。
内容的提问来源于stack exchange,提问作者divide_by_zero
相关产品推荐
相关产品推荐

