解决Gradle “Unsupported class file major version 65”错误
2025-01-11 05:35:21
解决 “Unsupported class file major version 65” 问题
在使用 Gradle 构建 Java 应用时,可能会遇到 Execution failed for task ':prepareModulesDir'. > Unsupported class file major version 65
这样的错误。这个错误信息揭示了什么?通常,它表示编译后的 Java 字节码的版本与运行它的 Java 虚拟机(JVM)的版本不兼容。具体来说,Java 版本和 class 文件major version之间的对应关系如下:
- 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
出现 version 65,往往意味着代码使用Java 21或更高版本进行编译,而你的 Gradle 项目或其他环境配置中使用了更低版本的 Java,比如 Java 17 或者其他。为了修正这一问题,你需要对以下几个环节进行检查并配置:项目设置,gradle 配置和 JDK环境。
方案一:检查并设置 sourceCompatibility
和 targetCompatibility
确保 Gradle 构建脚本 (build.gradle
或 build.gradle.kts
) 中指定了正确的 sourceCompatibility
和 targetCompatibility
版本。 这两个配置项指示了 Gradle 在编译和运行时的目标 Java 版本。
// build.gradle
plugins {
id 'java'
}
java {
sourceCompatibility = JavaVersion.VERSION_21
targetCompatibility = JavaVersion.VERSION_21
}
- 操作步骤 :
- 打开项目根目录下的
build.gradle
或build.gradle.kts
文件。 - 找到或添加
java
代码块,其中设置sourceCompatibility
和targetCompatibility
。 - 如果你的项目已经有了这行配置,请确保设置值为
JavaVersion.VERSION_21
或需要的Java版本 。 - 保存更改后,重新运行
./gradlew clean build
命令来验证修复。
- 打开项目根目录下的
方案二:检查 gradle.properties
中的 Java 主目录设置
gradle.properties
文件中 org.gradle.java.home
属性可以用来指定 Gradle 使用的 Java 主目录。如果设置不正确,或者指向了不兼容的 Java 版本,可能引发问题。
#gradle.properties
org.gradle.java.home=/path/to/your/java21
- 操作步骤 :
- 找到项目根目录下的
gradle.properties
文件。 - 确认
org.gradle.java.home
指向的是 Java 21 安装的正确目录。需要确认的是/bin/java
所在的父文件夹。比如Mac 电脑中的常见JDK目录:/Library/Java/JavaVirtualMachines/corretto-21.0.4/Contents/Home
。 - 若路径不正确,请更改为Java 21的正确路径,或删除该设置(使 Gradle 使用默认的JAVA_HOME设置)。
- 保存更改,再次执行
./gradlew clean build
命令。
- 找到项目根目录下的
方案三:确保 Gradle 使用正确的 JDK
某些情况下,尽管已经设置了 org.gradle.java.home
属性,Gradle 可能仍旧会使用错误的 JDK。这个时候需要通过gradle wrapper
来检查是否使用正确版本的java。 可以使用命令检查:
./gradlew --status
通过命令执行后,找到"JVM arguments:"的对应内容,其中就会有相应的java版本信息, 如果版本不是我们预期的java版本(比如java21), 则需要进一步调整:
- 确保全局的
$JAVA_HOME
环境变量指向的也是java 21的目录。 - 清理 gradle 的缓存文件夹。缓存的 gradle 的缓存可能指向错误的java环境:使用
rm -rf ~/.gradle/caches/
进行清理. - 最后再次执行
./gradlew clean build
命令。
方案四:Gradle 版本兼容性问题
较低的 Gradle 版本可能与较新的 JDK 不完全兼容。可以考虑更新 gradle wrapper的版本来匹配当前项目需要java版本.修改 gradle-wrapper.properties文件:
distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip
- 在项目根目录找到
gradle/wrapper/gradle-wrapper.properties
文件。 - 修改
distributionUrl
属性,指定更新版本的 gradle 版本(建议选用比较新的版本如gradle 8.x), 如:distributionUrl=https://services.gradle.org/distributions/gradle-8.8-bin.zip
, 根据自己的情况设置。 - 使用
./gradlew wrapper --gradle-version 8.8
命令重新生成gradle-wrapper.jar, 此处以8.8版本举例,根据实际情况指定。
* 再次运行./gradlew clean build
。
安全提示
- 始终检查 JAVA_HOME :务必检查系统环境变量
JAVA_HOME
是否指向了正确的 Java 安装路径,特别是在同时安装多个 JDK 的情况下。 - 清理缓存 :定期清理 Gradle 和 IntelliJ 的缓存,避免旧配置造成影响,使用
rm -rf ~/.gradle/caches/
进行清理 gradle 缓存文件夹。 - 依赖兼容性 :注意你的项目依赖项可能存在兼容性问题,尤其是一些老旧的依赖可能需要升级,或者选择与你的JDK版本相兼容的依赖版本。
通过上述检查和修改步骤,通常能够有效解决 “Unsupported class file major version 65” 的问题。当此类错误发生时,请耐心检查每个环节的设置,以便准确锁定并解决问题。记住,确保所有工具和环境都使用统一的Java版本是至关重要的。