Android Java和Kotlin的目标JVM版本不一致

报错信息

Execution failed for task ‘:app:kaptGenerateStubsDebugKotlin’.

‘compileDebugJavaWithJavac’ task (current target is 1.8) and ‘kaptGenerateStubsDebugKotlin’ task (current target is 17) jvm target compatibility should be set to the same Java version.
Consider using JVM toolchain: https://kotl.in/gradle/jvm/toolchain

报错说明

这个错误消息表明在编译过程中,Java和Kotlin的目标JVM版本不一致。具体来说,Java代码的目标版本是1.8,而Kotlin代码的目标版本是17。为了确保一致性,需要将两个目标JVM版本设置为相同的Java版本。

错误出现场景

升级Gradle8.0,并且用到了Kapt出现

当前环境

Gradle 版本:8.0

APG 版本:8.1.2

kotlin 插件版本:1.8.10

解决方案

一、升JDK版本

build.gradle(:app)

plugins {
    id 'com.android.application'
    id 'org.jetbrains.kotlin.android'
    id 'kotlin-kapt'
}

android {
	...
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_17
        targetCompatibility JavaVersion.VERSION_17
    }
    kotlinOptions {
        jvmTarget = '17'
    }
}

将JAVA和KOTLIN的JDK版本指定到高版本解决

二、降JDK版本

考虑到兼容性问题,防止开发时使用到JAVA17新特性,运行到不支持JAVA17的手机上

build.gradle(:app)

plugins {
    id 'com.android.application'
    id 'org.jetbrains.kotlin.android'
    id 'kotlin-kapt'
}
android {
	...
    compileOptions {
        // 指定Java编译器使用的源代码版本,这里设置为Java 1.8。这意味着编译器将把代码视为Java 1.8版本的代码。
        sourceCompatibility JavaVersion.VERSION_1_8
        // 指定生成的字节码版本,这里设置为Java 1.8。这意味着编译器将生成可以在支持Java 1.8的JVM上运行的字节码。
        targetCompatibility JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        // 指定Kotlin编译器生成的字节码版本,这里设置为1.8。这意味着Kotlin编译器将生成可以在支持Java 1.8的JVM上运行的字节码。
        jvmTarget = '1.8'
    }
    kotlin {
        // 配置Kotlin编译器使用的JDK版本,这里指定为8。这是指定Kotlin编译器使用JDK 8进行编译。
        jvmToolchain(8)
    }
}

在gradle.properties文件中添加以下属性

# java install path
org.gradle.java.installations.paths=E\:\\Android\\.gradle\\jdks\\corretto-1.8.0_422

E:\Android\.gradle\jdks\corretto-1.8.0_422 改成自己实际的低版本Java路径

详情可以查阅Toolchains for JVM projects (gradle.org),里面详细说明了Toolchain的配置。

查看项目所有的工具链

./gradlew -q javaToolchains

输出结果

  • Options
    | Auto-detection: Enabled
    | Auto-download: Enabled

  • Amazon Corretto JDK 1.8.0_422-b05
    | Location: E:\Android.gradle\jdks\corretto-1.8.0_422
    | Language Version: 8
    | Vendor: Amazon Corretto
    | Architecture: amd64
    | Is JDK: true
    | Detected by: system property ‘org.gradle.java.installations.paths’

  • JetBrains s.r.o. JDK 17.0.6+0-b2043.56-10027231
    | Location: E:\Android\Android Studio\jbr
    | Language Version: 17
    | Vendor: JetBrains s.r.o.
    | Architecture: amd64
    | Is JDK: true
    | Detected by: Current JVM

JAVA JDK下载方式

一、官网
  1. Java Downloads | Oracle
  2. Java | Oracle
二、Android Studio内下载

File -> Project Structure -> SDK Location -> Gradle Settings -> Gradle project -> Gradle JDK -> Download JDK

三、Toolchains for JVM projects (gradle.org)
  • 13
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Groovy和Kotlin/JVM都是基于Java虚拟机的编程语言,它们都可以与Java代码无缝集成。Groovy是一种动态语言,它具有简洁的语法和强大的元编程能力,可以用于编写脚本、测试、Web应用程序等。而Kotlin/JVM则是一种静态类型语言,它具有更严格的类型检查和更好的可读性,可以用于编写高性能的应用程序和库。两者都有其独特的优点和适用场景,具体选择取决于项目需求和开发者的偏好。 ### 回答2: Groovy和Kotlin/JVM是两种用于开发Java应用程序的编程语言。它们在语法、功能和用途上存在一些区别。 Groovy是一种动态类型的脚本语言,它在Java平台上运行,可以无缝地与Java代码互操作。它继承了Java的语法风格,但提供了更简洁、灵活和动态的语法。Groovy具有很高的可读性和表达能力,能够通过闭包、元编程和DSL特性实现更强大的功能。它广泛用于构建脚本、测试和编写简洁的Java代码。 而Kotlin/JVM是一种静态类型的编程语言,它旨在成为更安全、高效和现代的Java替代品。KotlinJava非常兼容,可以在同一个项目中无缝交互。Kotlin提供了更简洁、表达力强和易于理解的语法,可以大大减少模版代码的编写。它支持函数式编程和面向对象编程,具有空安全、扩展功能和更好的并发性能等优点。Kotlin广泛应用于Android开发和企业级应用开发。 Groovy和Kotlin/JVM在很多方面都有相似之处,都可以使用Java类库和框架,并与Java代码无缝协作。它们都提供了更好的表达能力和功能,使开发变得更高效和简单。选择使用哪种语言取决于项目需求、团队经验和个人偏好。如果项目要求更动态、灵活和脚本化的开发,Groovy可能是更好的选择。如果项目需要更安全、现代和可预测的开发,Kotlin/JVM可能是更适合的选择。无论选择哪种语言,都能够更好地提高开发效率和代码质量。 ### 回答3: Groovy和Kotlin/JVM是两种流行的编程语言,都可以在Java虚拟机(JVM)上运行。它们都是基于Java语言的,并且都具有许多相似的特性,如面向对象编程、函数式编程和静态类型检查。 Groovy是一门动态语言,它具有简洁的语法和能够在运行时进行动态编译的能力。它可以与Java代码无缝集成,可以直接使用Java类和库,同时还提供了一些简化开发的特性,如闭包和元编程。Groovy也具有较强的脚本编程能力,适合用于编写小型脚本和快速原型开发。 Kotlin/JVM是一门静态类型语言,也可以与Java代码无缝集成。与Groovy相比,Kotlin更加强调类型安全和功能性编程,提供了更强大的静态类型检查和更严格的编码规范。Kotlin还引入了一些现代化的特性,如空安全、扩展函数和数据类,可提高开发效率和代码可读性。 对于选择使用哪种语言,取决于具体的需求和个人偏好。Groovy适用于快速原型开发和小型脚本编写,它的动态特性和简洁的语法可以提高开发效率。而Kotlin/JVM适用于更大型的应用程序开发,它的静态类型检查和现代特性可以提供更好的代码可维护性和性能。 总的来说,Groovy和Kotlin/JVM都是优秀的编程语言,可以根据项目需求和个人喜好选择适合的语言来进行开发。无论选择哪种语言,都能在JVM上获得良好的运行效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值