Android AGP 8 + Gradle 8 + Kotlin 1.8在Kapt中导致错误

回答 4 浏览 1495 2023-04-16

我刚刚更新到Android Studio Flamingo | 2022.2.1。现在我得到这个错误:

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

我使用的是AS包含的Kotlin,它是1.8.0,但这在AGP 7.4.2和Gradle 7.5时工作得很好--只有在AS Flamingo的Gradle和AGP更新中才会出现问题。另外:

  • 如果我把Kotlin降级到1.7.20,它就能重新工作了。
  • 如果我将Kotlin更新为1.8.20,就会出现上述错误。

我有编译的选项:

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = '1.8'
    }

我也试过AS应用的样本,但它们有Kotlin 1.7.20。它们也可以在Kotlin 1.8.0下工作--除非你在依赖关系中引入kapt!(例如Dagger)

那么,什么是应该工作的组合--包括kapt--并且有Android Studio的最新稳定推荐版本?

  • Android Studio的版本?
  • AGP版本吗?
  • Gradle的版本?
  • Kotlin的版本?

请不要提供未经测试的答案。我知道这应该是可行的,但它并不可行。

RumburaK 提问于2023-04-16
我相信这可能是与这里相同的问题?JustSightseeing 2023-04-16
这是不一样的,那是关于使用错误的JDK来编译的。这与预处理程序和编译选项有关。RumburaK 2023-04-16
4 个回答
#1楼 已采纳
得票数 8

最新的Android Gradle插件和Kotlin kapt之间存在一个兼容性问题。因此,你在Android配置中指定的jvmTarget将在Kotlin编译任务中设置,但在kapt任务中不设置,后者默认使用工具链版本(目前是JDK 17)。

作为一种变通方法,在kapt任务上手动设置jvmTarget(在你的例子中,目标是Java 1.8):

tasks.withType(org.jetbrains.kotlin.gradle.tasks.KaptGenerateStubs).configureEach {
    kotlinOptions {
        jvmTarget = "1.8"
    }
}
BladeCoder 提问于2023-04-18
BladeCoder 修改于2023-04-18
你有最新的Android Gradle插件和Kotlin kapt之间的相关兼容性问题的链接吗?chrisfey 2023-05-16
谢谢你的帮助!我已经有一个kotlinOptions来处理compileDebugKotlin,但需要这个额外的tasks.withType来解决kaptGenerateStubsDebugKotlin问题!Bink 2023-05-18
#2楼
得票数 4

我认为使用jvmToolchain作为错误信息的说法会解决这个问题:

考虑使用JVM工具链:https://kotl.in/gradle/jvm/toolchain

用下面的版本和配置,我的项目工作得很好。

  • Android Studio Flamingo 2022.2.1
  • AGP version 8.0.0
  • Gradle version 8.0
  • Kotlin version 1.8.0

在build.gradle中的配置:

kotlin {
    jvmToolchain(8)
}


android {

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    kotlinOptions {
        jvmTarget = '1.8'
    }
}

如果想了解更多的细节,你可以在下面两个链接中看到相关的官方文件和解释:

https://kotlinlang.org/docs/gradle-configure-project.html#gradle-java-toolchains-support

无法设置kapt jvm的目标版本:

https://youtrack.jetbrains.com/issue/KT-55947

yufeng wu 提问于2023-04-18
yufeng wu 修改于2023-04-18
使用jvmToolchain(8)需要你在机器上安装JDK 8,这可能不被最近版本的Android Gradle插件所支持。对于Android来说,最好使用默认的工具链,并手动将jvmTarget设置为较低版本。BladeCoder 2023-04-18
@BladeCoder怎么了?RumburaK 2023-04-19
@yufeng wu不工作,我得到了:> No matching toolchains found for requested specification: {languageVersion=8, vendor=any, implementation=vendor-specific}.RumburaK 2023-04-19
@BladeCoder是对的!我将接受他的答案。谢谢!RumburaK 2023-04-19
文档建议不要使用AGP 8.1.0-alpha09之前的JVM工具链。argenkiwi 2023-04-21
#3楼
得票数 2

我在我的项目中使用了以下版本,在这些版本中,项目的构建没有问题:

  • Android Studio Flamingo 2022.2.1
  • AGP版本 8.0.0
  • Gradle版本 8.0
  • Kotlin版本 1.8.0

要摆脱这个错误,请将你的代码改为以下内容:

android {
    ...
    compileOptions {
        sourceCompatibilityJavaVersion.VERSION_17
        targetCompatibilityJavaVersion.VERSION_17
    }
    kotlinOptions {
        jvmTarget = '17'
    }
    ...
}

在这里你可以看到Gradle 8.0.0兼容性表,其中有项目中应该使用的JDK的版本。

Victor Sklyarov 提问于2023-04-16
Victor Sklyarov 修改于2023-04-16
谢谢!它似乎可以工作,但我感到困惑,我以为旧版本的Android只能运行Java 7或8,我的应用程序支持到API 19(KitKat),所以它怎么能支持为Java 17编译的应用程序集?RumburaK 2023-04-17
我检查了一下,它在API 19和早期的API 16中都能很好地工作。Victor Sklyarov 2023-04-17
我也是,虽然我想了解。我从未在文档中看到Java 17,只有Java 8。也许这与解构有关?但它会支持所有的语言特性吗?如果不支持,它是否会在出错时发出警告?RumburaK 2023-04-17
我能够在AVD管理器中的虚拟设备上运行API 16和JDK 17的应用程序,并带有API 16 Android 4.1(Google API)镜像。我认为在物理设备上也应该没有问题。Victor Sklyarov 2023-04-17
这不是一个适当的修复,它迫使你使用一个与当前工具链版本相等的目标兼容版本,这不是大多数人想要的东西。BladeCoder 2023-04-18
#4楼
得票数 0

这对我来说是非常有效的╰( ͡° ͜ʖ ͡° )つ──☆*:・゚。

项目的build.gradle文件中:

allprojects {    tasks.withType(org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile).configureEach {
        kotlinOptions {
            jvmTarget = "1.8"
            apiVersion = "1.8"
            languageVersion = "1.8"
        }
    }
}
GFPF 提问于2023-04-24