返回

解决Gradle “Unsupported class file major version 65”错误

java

解决 “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环境。

方案一:检查并设置 sourceCompatibilitytargetCompatibility

确保 Gradle 构建脚本 (build.gradlebuild.gradle.kts) 中指定了正确的 sourceCompatibilitytargetCompatibility 版本。 这两个配置项指示了 Gradle 在编译和运行时的目标 Java 版本。

// build.gradle
plugins {
    id 'java'
}

java {
    sourceCompatibility = JavaVersion.VERSION_21
    targetCompatibility = JavaVersion.VERSION_21
}

  • 操作步骤
    1. 打开项目根目录下的 build.gradlebuild.gradle.kts 文件。
    2. 找到或添加 java 代码块,其中设置 sourceCompatibilitytargetCompatibility
    3. 如果你的项目已经有了这行配置,请确保设置值为 JavaVersion.VERSION_21或需要的Java版本 。
    4. 保存更改后,重新运行 ./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
  • 操作步骤
    1. 找到项目根目录下的 gradle.properties 文件。
    2. 确认org.gradle.java.home 指向的是 Java 21 安装的正确目录。需要确认的是/bin/java 所在的父文件夹。比如Mac 电脑中的常见JDK目录:/Library/Java/JavaVirtualMachines/corretto-21.0.4/Contents/Home
    3. 若路径不正确,请更改为Java 21的正确路径,或删除该设置(使 Gradle 使用默认的JAVA_HOME设置)。
    4. 保存更改,再次执行 ./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版本是至关重要的。