如何在build.gradle.kts中设置compileJava'任务(11)和'compileKotlin'任务(1.8)jvm目标兼容性到相同的Java版本?

How to set compileJava' task ( 11) and 'compileKotlin' task (1.8) jvm target compatibility to the same Java version in build.gradle.kts?

提问人:jitendra kumar 提问时间:9/7/2021 最后编辑:Donald Duckjitendra kumar 更新时间:11/24/2023 访问量:190451

问:

构建.gradle.kts

buildscript {
    repositories {
        google()
        mavenCentral()
        gradlePluginPortal()
    }
    dependencies {
        classpath ("com.android.tools.build:gradle:7.0.2")
        classpath ("org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.30")
        classpath("gradle.plugin.com.github.spotbugs.snom:spotbugs-gradle-plugin:${Versions.spotbugsGradlePluginVersion}")
        classpath("se.bjurr.violations:violations-gradle-plugin:${Versions.violationsVersion}")

    }
}
//android {
//    compileOptions {
//        sourceCompatibility = JavaVersion.VERSION_11
//                targetCompatibility = JavaVersion.VERSION_11
//    }
//
//    kotlinOptions {
//        jvmTarget = JavaVersion.VERSION_11.toString()
//    }
//}
plugins {
    `maven-publish`
    `java-gradle-plugin`
    `kotlin-dsl`
    id ("io.gitlab.arturbosch.detekt") version ("1.18.1")
}
repositories {
    google()
    mavenCentral()
    gradlePluginPortal()
}

dependencies {
    compileOnly(gradleApi())
    testImplementation(gradleTestKit())
    testImplementation("junit:junit:${Versions.jUnitVersion}")
}
val generatedSources = tasks.register<GenerateVersionsFileTask>("generateSources")

我收到以下错误:

错误:“compileJava”任务(当前目标是 11)和“compileKotlin”任务(当前目标是 1.8)jvm 目标兼容性应设置为相同的 Java 版本。

当我取消注释时,我得到:android {}

错误:脚本编译错误:

 Line 15: android {
           ^ Unresolved reference: android
Java Kotlin 依赖项 gradle-kotlin-dsl

评论

0赞 sschuberth 9/24/2021
请注意,如果您没有任何 Java 源代码(只有 Kotlin 源代码),则此消息实际上根本不应该出现,另请参阅 youtrack.jetbrains.com/issue/KT-48745
0赞 Tom Rutchik 4/28/2022
我相信“android”块无法解析是因为您没有应用“com.android.application”或“com.android.library”插件

答:

135赞 Marian 9/7/2021 #1

你可以用

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

或者:

java {
    toolchain.languageVersion.set(JavaLanguageVersion.of(11))
}

对于 Kotlin,则具有:

tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile>().configureEach {
    kotlinOptions {
        jvmTarget = "11"
    }
}

所有样本都在 gradle kotlin dsl 中。

评论

4赞 GhostCat 2/17/2022
注意:当我按原样使用你的时,我得到.使用时错误消失;所以括号而不是< >。但不幸的是,这仍然导致了提问者提出的相同警告;-(tasks.withType<>Could not get unknown property 'withType' for task set of type org.gradle.api.internal.tasks.DefaultTaskContainertasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile) {
1赞 CodeClown42 5/28/2022
@GhostCat 在我更新版本后,我刚刚使用一个曾经可以正常工作的旧构建文件(<>而不是 ())遇到了这个问题。我以为这是一个gradle API更改,但找不到正确的方法来做到这一点。然后在某个时候我把它放回去(它只是被注释掉了)然后去想想,它有效。:\中间唯一重要的事情是“使缓存无效并重新启动”,因为依赖 jar 的较新版本没有被正确索引。你和你的两个蜱虫暗示我没有疯,尽管我认为这个问题不容易重现......kotlin("jvm")
0赞 GhostCat 6/6/2022
也许这取决于 Kotlin 插件版本。这里有各种活动部件。
0赞 TWiStErRob 8/17/2022
问题是 ,是 Kotlin Gradle DSL 语法,是 Gradle Groovy 语法。build.gradle.ktstasks.withType<T> { ... }tasks.withType(T) {
1赞 k4dima 3/15/2023
java.toolchain.languageVersion.set(JavaLanguageVersion.of(17))
52赞 LXJ 2/20/2022 #2

@Marian的回答对我没有太大帮助。

我最终在应用程序build.gradle中设置了以下内容

android {
...
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_11
        targetCompatibility JavaVersion.VERSION_11
    }

    kotlinOptions {
        jvmTarget=11
    }
...
}

评论

1赞 Tom Rutchik 4/28/2022
这真的对你有用吗?我以为android仅限于jvm 1.8!
0赞 LXJ 4/28/2022
从 Android Gradle 插件 7.0 开始,需要 Java 11。以上对我有用。
2赞 Tom Rutchik 4/28/2022
是的,我确实知道 Android gradle 插件需要 Java 11。这是构建所需的最低 JVM 级别。Android/compileOption/sourceCompatibiity 是您希望将 android 代码编译到的 jvm 级别,据我所知,这仅限于 1.8 版。我认为如果您在 android 代码中使用一些 java 11 功能,我认为它会崩溃。
25赞 Arcao 1/17/2023
这不适用于 Gradle 7.6 和 AGP 7.4.0。它在 KAPT 中显示:“compileDebugJavaWithJavac”任务(当前目标是 11)和“kaptGenerateStubsDebugKotlin”任务(当前目标是 1.8) jvm 目标兼容性应设置为相同的 Java 版本。默认情况下,自 Gradle 8.0+ 以来将成为一个错误!阅读更多:kotl.in/gradle/jvm/target-validation 考虑使用 JVM 工具链:kotl.in/gradle/jvm/toolchain
6赞 android developer 3/4/2023
@Arcao 我不明白在那里做什么。我应该更改/添加/删除什么?
6赞 Alejandro Moya 6/23/2022 #3

如果有人不断收到有关将 java 编译任务设置为 java 1.8 的警告,您可以将其添加到 gradle 脚本中:

afterEvaluate {
    tasks.withType<JavaCompile>().configureEach {
        sourceCompatibility = JavaVersion.VERSION_11.toString()
        targetCompatibility = JavaVersion.VERSION_11.toString()
    }
}

我在 AS 上收到一些 java 编译任务的警告,这为我解决了它。

13赞 Niklas 6/25/2022 #4

这对我来说效果很好:

kotlin {
  jvmToolchain {
    languageVersion.set(JavaLanguageVersion.of("11"))
  }
}

这样我只需要设置一次。

评论

2赞 TWiStErRob 8/17/2022
这是在 Kotlin 1.5.30 中添加的,仅与 Gradle 7.2+ 兼容
2赞 Akbolat SSS 9/15/2022
我需要把它放在哪里?在每个模块内部还是在根目录中?
0赞 Akbolat SSS 9/15/2022
或者也许在 buildSrc/build.gradle.kts 中?
0赞 Andrew Coates 11/4/2022
这对我有用,尽管我需要像这样投射:languageVersion(this as JavaToolchainSpec).languageVersion
0赞 RealityExpander 4/9/2023
@AkbolatSSS 我把我的放在文件根目录的build.gradle.kts中(不在任何子层次结构中)。我把建议的答案放在它自己的块中。我正在使用 Ktor 项目,但这个想法与 Android 项目类似(我也是 Android 开发人员)
2赞 Rahul Raina 8/3/2022 #5

这个解决方案对我有用:

只需替换语句(或类似内容):

kotlinOptions {
    jvmTarget = JavaVersion.VERSION_1_8.toString() 
}

kotlinOptions {
    jvmTarget = "1.8"
}

在所有模块级别文件中,然后同步 Gradle 。build.gradle

希望这能奏效。祝您编码愉快......!

5赞 expert 1/3/2023 #6

令人惊讶的是,罪魁祸首非常简单。您需要在 之前声明您的任务。喜欢这个KotlinCompileJavaCompile

tasks {

    withType<KotlinCompile> {
    
        kotlinOptions {
            freeCompilerArgs = listOf(
                "-Xextended-compiler-checks",
                "-Xinline-classes",
                "-Xjsr305=strict",
                "-Xjvm-default=all",
                "-Xskip-prerelease-check",
            )
            apiVersion = "1.8"
            languageVersion = "1.8"
            jvmTarget = "11"
        }
    }
    
    withType<JavaCompile> {
        sourceCompatibility = "11"
        targetCompatibility = "11"
    }
}
4赞 Tom Rutchik 1/27/2023 #7

需要应用 Marian 的解决方案(见上文),但您仍然可能会看到相同的消息作为警告,尤其是当您从命令行运行“gradle build”时。我认为,如果您从 Android Studio 与 gradle “同步”,您可能不会看到警告消息。如果您在正确应用 Maryan 的解决方案后仍然看到该消息,则这显然是一条虚假的警告消息。我的理解是,一旦您升级到使用 kotlin 1.6+,虚假的警告消息就会消失。您可以通过将以下内容添加到 gradle.properties 文件来禁用此虚假警告。

kotlin.jvm.target.validation.mode = IGNORE

我不建议使用上述内容,但我肯定解决了看到虚假警告消息的问题。如果您确实使用它,请记住在不再需要它时将其删除。

对于我们大多数人来说,问题是我们目前无法升级到 kotlin 1.6.21。要升级到 kotlin 1.6.21,您需要升级到 android gradle 7.4。要升级到 android gradle 7.4,您需要一个高于 Dolphin |2021.3.1,因此此时您必须使用 Android Studio 的预览版本之一来执行此操作。

有关兼容性信息,请参阅 https://developer.android.com/studio/releases/gradle-pluginhttps://developer.android.com/studio/releases#android_gradle_plugin_and_android_studio_compatibility

35赞 Pascal 2/9/2023 #8

为了在“Java 和 Kotlin”中拥有“相同版本的 Java”,
只需像这样修改您的 build.gradle 文件(Java 11 给出的示例):

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
...
android {
    ...
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_11
        targetCompatibility JavaVersion.VERSION_11
    }

    // New syntax (credit goes to ʍѳђઽ૯ท in comment)
    kotlin {
        jvmToolchain(11)
    }
/*
    FYI: Old syntax:
    kotlin {
        jvmToolchain {
            languageVersion.set(JavaLanguageVersion.of("11"))
        }
    }
    FYI: Deprecated syntax:
    kotlinOptions {
        jvmTarget = "11"
    }
*/
    ...
}

我的配置:

Gradle:

  • Android Gradle 插件:com.android.tools.build:gradle:7.4.1
  • Gradle:7.5(截至 ./gradle/wrapper/gradle-wrapper.properties)

科特林:

关于新语法
请参阅 JVM 工具链配置的新方法

注意:
有关 Kotlin 配置的更多信息,请访问:https://blog.jetbrains.com/kotlin/2021/11/gradle-jvm-toolchain-support-in-the-kotlin-plugin/

评论

4赞 qix 2/14/2023
实际上,也可以;请注意,该值是一个字符串。回复:kotlinlang.org/docs/......但是,是的,1.8 gradle 插件建议:“考虑使用 JVM 工具链”(kotlinlang.org/docs/...),作为“kotlinOptions 任务输入和 kotlinOptions{...}任务 DSL 处于支持模式,将在即将发布的版本中弃用。kotlinOptions { jvmTarget = "11" }
1赞 ʍѳђઽ૯ท 3/5/2023
您也可以将 11 作为参数传递,如下所示:jvmToolchain(11)
7赞 tejj 4/13/2023 #9
allprojects {
    tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile>().configureEach {
        kotlinOptions {
            jvmTarget = JavaVersion.VERSION_1_8.toString()
        }
    }
}

通过将此任务包含在 build.gradle 中,告诉编译器在您的项目中使用 JavaVersion = 1.8。

评论

0赞 Ian Andwati 8/25/2023
这对我有用
192赞 Reejesh 4/20/2023 #10

我们还需要注意错误显示的版本。就我而言,它是:

原因:org.gradle.api.GradleException: 'compileDebugJavaWithJavac' 任务(当前目标为 1.8)和“compileDebugKotlin”任务(当前目标为 17) jvm 目标兼容性应设置为相同的 Java 版本。

这意味着,Android Studio IDE 使用的是 17(您可以在文件菜单->项目结构->SDK 位置->JDK 位置)中找到它

并且您在 gradle 文件中使用 1.8。

所以你需要改变

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

kotlinOptions {
    jvmTarget = '1.8'
}

compileOptions {
    sourceCompatibility JavaVersion.VERSION_17
    targetCompatibility JavaVersion.VERSION_17
}

kotlinOptions {
    jvmTarget = '17'
}

请注意,

由于错误显示 17,我也切换到了 17。

当我将 gradle 升级到 8.0 时,就发生了这种情况。

谨防发布问题。请在执行之前进行备份 程序。在发布 aab 时可能会遇到问题。

确保在完成此过程后检查发布 apk,因为 R8 需要这样的事情

评论

0赞 MohammedYakub M. 8/30/2023
面对确切的问题,你在这里提到了所有的事情,但仍然没有锁。你能解决这个问题吗?
0赞 Reejesh 9/4/2023
@MohammedYakubM。也许您可以尝试更改 Android Studio 设置以匹配旧的 Graddle。希望您使用的是最新版本的 Android Studio。我在火烈鸟上检查了一下。
0赞 Ali Doran 10/25/2023
@Reejesh 为什么我们在创建新项目时不遇到这个问题?创建一个新项目。你看到 Gradle 的编号是 1_8/1.8,但它在 Java 17 中工作没有问题
27赞 Desilio Neto 4/22/2023 #11

将 Android Studio 更新到 Flamingo 版本后,我遇到了同样的问题,这是我在 build.gradle 中的新配置

 compileOptions {
    sourceCompatibility JavaVersion.VERSION_17
    targetCompatibility JavaVersion.VERSION_17
}
kotlinOptions {
    jvmTarget = '17'
}
0赞 Faqiang 4/25/2023 #12

我通过更新gradle.properties文件中的配置解决了这个问题。

改变

distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip

distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip

12赞 MD. Shafiul Alam Biplob 5/3/2023 #13

我首先尝试了所有模块的以下代码

compileOptions {
    sourceCompatibility = '1.8'
    targetCompatibility = '1.8'
}
kotlinOptions {
    jvmTarget = '1.8'
}

在gradle.properties中添加以下行后,解决了这个问题。

kotlin.jvm.target.validation.mode = IGNORE

评论

1赞 K D 5/5/2023
此外,从所有插件的buildgradle中删除软件包作为临时解决方案。- 建议:从源 AndroidManifest 中删除 package=“io.github.zeshuaro.google_api_headers”.xml:C:\Users\DBS-05\AppData\Local\Pub\Cache\hosted\pub.dev\google_api_headers-1.5.0+1\android\src\main\AndroidManifest.xml。- 感谢您在gradle.properties中的更新
0赞 Hossein Kurd 7/20/2023
好主意,我们为什么要减少 sourceCompatibilitytargetCompatibility 版本?!我做到了并解决了
1赞 Saran 7/7/2023 #14

几乎所有的答案都彼此之间有微小的差异,我的也是如此。

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    kotlin {
        jvmToolchain(8)
    }

这对我有用。看起来工具链默认为不同的值,否则,这会覆盖以匹配编译选项并解决问题。

1赞 The Droid Guy 7/9/2023 #15

其中一个非常相似的错误可能是这样的。 任务“:app:kaptGenerateStubsDebugKotlin”执行失败。

“compileDebugJavaWithJavac”任务(当前目标是 1.8)和“kaptGenerateStubsDebugKotlin”任务(当前目标是 17) jvm 目标兼容性应设置为相同的 Java 版本。

首先,我会请您在 Android Studio 中转到此路径并检查您正在使用的 Gradle JDK 版本...... 只需转到 ->文件->设置->构建、执行、开发->构建工具->Gradle 现在,在 Gradle SDK 中查看选择的版本。

现在要修复该错误,请打开“应用模块”的“build.gradle”文件。 要修复它,请确保检查您在“build.gradle”中的两个块处是否有相同的 java 版本。 第一个在“compileOptions”中,确保这两行具有与您在 Gradle SDK 中使用的相似的 java 版本(如上所述),

compileOptions {
    sourceCompatibility JavaVersion.VERSION_11
    targetCompatibility JavaVersion.VERSION_11
}

第二个要检查的块是“kotlinOptions”,也在这里检查 Java 版本,

kotlinOptions {
    jvmTarget = '11'
}

希望这将解决错误。

3赞 PalFS 7/11/2023 #16

我经历过相同的情况,并尝试了上面提到的不同变体。我遇到的奇怪行为是,项目在第一次尝试时成功构建,但在尝试再次构建时再次出现相同的错误。

幸运的是,我找到了解决该问题的解决方法。通过将 Gradle 版本从 8.0 恢复到 7.5,问题得到了解决,我能够构建项目而不会出现任何进一步的错误。

评论

0赞 Tom Rutchik 8/30/2023
kotlinlang.org/docs/... .此链接显示了 KGP 版本(kotlin gradle 插件与最小/最大 Gradle 和 AGP 版本)之间的关系。很有可能,PalFS问题和解决方案可以通过链接中的兼容性表来解释!
2赞 hahahacker 7/20/2023 #17

对于任何已经做了所有事情但仍在与此问题作斗争的人,请尝试降级您的 gradle 版本。就我而言,我将 8.0 更改为 7.5,它有所帮助。

0赞 Hossein Kurd 7/20/2023 #18
  1. 从 AndroidManifesty 的 manifest 标记中删除软件包.xml
  2. 将以下命令添加到项目的 gradle.properties 中:

kotlin.jvm.target.validation.mode = 忽略 3. 确保 kotlinOptions 已在 compileOptions 旁边设置: 编译选项 { source兼容性JavaVersion.VERSION_1_8 target兼容性JavaVersion.VERSION_1_8 } kotlin选项 { jvmTarget = '1.8' }

5赞 ahmnouira 8/3/2023 #19

通过使用相同的 Java 版本解决了这个问题:

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_17
        targetCompatibility JavaVersion.VERSION_17
    }
    kotlinOptions {
        jvmTarget = '17'
    }
0赞 Asif A 9/5/2023 #20
compileOptions {
        sourceCompatibility = JavaVersion.VERSION_11
        targetCompatibility = JavaVersion.VERSION_11
    }
    kotlinOptions {
        jvmTarget = "11"
    }
0赞 Ramchandra Singh 9/14/2023 #21

将此包导入到 gradle.kts :app 文件中。

import org.jetbrains.kotlin.gradle.internal.KaptGenerateStubsTask

将其粘贴到 android 块后的 gradle kts 文件中

tasks.withType(type = KaptGenerateStubsTask::class) {
        kotlinOptions.jvmTarget = JavaVersion.VERSION_11.toString()
    
    }

如果您使用的是 Java 版本 1.8,请将 VERSION_11 替换为 VERSION_1_8

1赞 Ivan Bartsov 10/7/2023 #22

所以,这里似乎有一个奇怪的特例,在 KT-55947 中正在讨论:kapt

基本上,除了使用新的 API(可能有很多理由不这样做)之外,在 Android 应用程序中强制执行特定 JVM 兼容级别的通常方法如下:jvmToolkit

android {
    //...
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_11
        targetCompatibility = JavaVersion.VERSION_11
    }

    kotlinOptions {
        jvmTarget = "11" // Or JavaVersion.VERSION_11.toString()
    }
}

但是,如果您使用 Kotlin,它很可能没有获取配置,并且仍然“配置错误”(严格来说,您的构建不是 100% 可重现的),因此您会在步骤中得到如下内容:kapt1.8+jvmTargetkaptGenerateStubs

> Task :XXXXX:kaptGenerateStubsReleaseKotlin
'compileReleaseJavaWithJavac' task (current target is 11) and 'kaptGenerateStubsReleaseKotlin' task (current target is 1.8) jvm target compatibility should be set to the same Java version.

在不使用 API 的情况下,必须像这样显式配置 kapt 任务(所有功劳都归功于上述 KT-55947 问题的知识渊博的人)jvmToolkit

// app|module-level build.gradle.kts, outside the android {} block

tasks.withType(type = org.jetbrains.kotlin.gradle.tasks.KaptGenerateStubs::class) {
    kotlinOptions.jvmTarget = "11"
}
0赞 Mladen Rakonjac 10/28/2023 #23

我看到在其他答案中,建议使用 Java 17。但是,它不是必需的,我们需要使用:

 compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

kotlinOptions {
    jvmTarget = "1.8"
}

此外,我们应该在应用程序中的每个模块中都包含它。

如果我们的模块只是 java/kotlin 模块,不使用 Android 插件,那么您可以在 build.gradle 文件的末尾添加以下行:

compileJava {
    sourceCompatibility = JavaVersion.VERSION_1_8
    targetCompatibility = JavaVersion.VERSION_1_8
}

compileKotlin {
    kotlinOptions {
        jvmTarget = "1.8"
    }
}

这将解决问题。