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

jit*_*mar 275 java dependencies kotlin android-gradle-plugin gradle-kotlin-dsl

构建.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")
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

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

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

错误:脚本编译错误:

 Line 15: android {
           ^ Unresolved reference: android
Run Code Online (Sandbox Code Playgroud)

Ree*_*esh 234

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

引起原因: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
}
Run Code Online (Sandbox Code Playgroud)

kotlinOptions {
    jvmTarget = '1.8'
}
Run Code Online (Sandbox Code Playgroud)

compileOptions {
    sourceCompatibility JavaVersion.VERSION_17
    targetCompatibility JavaVersion.VERSION_17
}
Run Code Online (Sandbox Code Playgroud)

kotlinOptions {
    jvmTarget = '17'
}
Run Code Online (Sandbox Code Playgroud)

注意

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

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

注意发布问题。请在执行该过程之前进行备份。发布 aab 时可能会遇到问题。

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

  • 面临确切的问题,做了你在这里提到的所有事情,但仍然没有锁定。你能解决这个问题吗? (2认同)

小智 140

您可以使用以下命令设置 java 的 java 版本

java {
    sourceCompatibility = JavaVersion.VERSION_11
    targetCompatibility = JavaVersion.VERSION_11
}
Run Code Online (Sandbox Code Playgroud)

或者:

java {
    toolchain.languageVersion.set(JavaLanguageVersion.of(11))
}
Run Code Online (Sandbox Code Playgroud)

对于 kotlin 来说:

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

所有示例均位于 gradle kotlin dsl 中。

  • 注意:当我按原样使用“tasks.withType&lt;&gt;”时,我得到“无法获取类型为 org.gradle.api.internal.tasks.DefaultTaskContainer 的任务集的未知属性“withType””。使用 `tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile) {`; 时错误消失 所以用括号代替 &lt; &gt;。但不幸的是,这仍然会导致提问者提出的同样的警告;-( (5认同)

LXJ*_*LXJ 56

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

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

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

    kotlinOptions {
        jvmTarget=11
    }
...
}
Run Code Online (Sandbox Code Playgroud)

  • 这不适用于 Gradle 7.6 和 AGP 7.4.0。它在 KAPT 中显示:“compileDebugJavaWithJavac”任务(当前目标是 11)和“kaptGenerateStubsDebugKotlin”任务(当前目标是 1.8)jvm 目标兼容性应设置为相同的 Java 版本。从 Gradle 8.0+ 开始默认会变成错误!了解更多:https://kotl.in/gradle/jvm/target-validation 考虑使用 JVM 工具链:https://kotl.in/gradle/jvm/toolchain (25认同)
  • @Arcao 我不明白在那里做什么。我应该更改/添加/删除什么? (6认同)
  • 是的,我确实知道 Android gradle 插件需要 Java 11。这是构建所需的最低 JVM 级别。Android/compileOption/sourceCompatibiity 是您希望 Android 代码编译到的 jvm 级别,这就是我所理解的仅限于 1.8 版本。我认为如果你在你的 android 代码中使用一些 java 11 功能,我认为它会崩溃。 (2认同)

Pas*_*cal 38

为了在“Java 和 Kotlin”中拥有“相同版本的 Java”,只需修改build.gradle文件,如下所示(针对 Java 11 给出的示例):

\n
apply plugin: \'com.android.application\'\napply plugin: \'kotlin-android\'\n...\nandroid {\n    ...\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_11\n        targetCompatibility JavaVersion.VERSION_11\n    }\n\n    // New syntax (credit goes to \xca\x8d\xd1\xb3\xd1\x92\xe0\xaa\xbd\xe0\xab\xaf\xe0\xb8\x97 in comment)\n    kotlin {\n        jvmToolchain(11)\n    }\n/*\n    FYI: Old syntax:\n    kotlin {\n        jvmToolchain {\n            languageVersion.set(JavaLanguageVersion.of("11"))\n        }\n    }\n    FYI: Deprecated syntax:\n    kotlinOptions {\n        jvmTarget = "11"\n    }\n*/\n    ...\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我的配置:

\n

摇篮:

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

科特林:

\n\n

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

\n

注意:
\n有关该问题的 Kotlin 配置的更多信息可在此处找到:\n https://blog.jetbrains.com/kotlin/2021/11/gradle-jvm-toolchain-support-in-the-kotlin-plugin/

\n

  • 实际上,`kotlinOptions { jvmTarget = "11" }` 也可以工作;请注意,该值是一个字符串。回复:https://kotlinlang.org/docs/whatsnew18.html#exusing-kotlin-compiler-options-as-gradle-lazy-properties 但是,是的,1.8 gradle 插件建议:“考虑使用 JVM 工具链”(https:// /kotlinlang.org/docs/gradle-configure-project.html#gradle-java-toolchains-support),因为“kotlinOptions 任务输入和 kotlinOptions{...} 任务 DSL 处于支持模式,并将在即将推出的版本中弃用”发布。” (4认同)

Des*_*eto 29

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

 compileOptions {
    sourceCompatibility JavaVersion.VERSION_17
    targetCompatibility JavaVersion.VERSION_17
}
kotlinOptions {
    jvmTarget = '17'
}
Run Code Online (Sandbox Code Playgroud)


小智 15

我首先尝试对所有模块使用以下代码

compileOptions {
    sourceCompatibility = '1.8'
    targetCompatibility = '1.8'
}
kotlinOptions {
    jvmTarget = '1.8'
}
Run Code Online (Sandbox Code Playgroud)

将以下行添加到 gradle.properties 后解决了问题。

kotlin.jvm.target.validation.mode = IGNORE
Run Code Online (Sandbox Code Playgroud)


Nik*_*las 14

这对我来说效果很好:

kotlin {
  jvmToolchain {
    languageVersion.set(JavaLanguageVersion.of("11"))
  }
}
Run Code Online (Sandbox Code Playgroud)

这样我只需要设置一次。

  • 我需要把它放在哪里?每个模块内部还是根目录? (3认同)
  • 这是在 [Kotlin 1.5.30](https://blog.jetbrains.com/kotlin/2021/11/gradle-jvm-toolchain-support-in-the-kotlin-plugin/) 中添加的,仅与 Gradle 7.2 兼容+ (2认同)

小智 8

allprojects {
    tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile>().configureEach {
        kotlinOptions {
            jvmTarget = JavaVersion.VERSION_1_8.toString()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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


Ale*_*oya 6

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

afterEvaluate {
    tasks.withType<JavaCompile>().configureEach {
        sourceCompatibility = JavaVersion.VERSION_11.toString()
        targetCompatibility = JavaVersion.VERSION_11.toString()
    }
}
Run Code Online (Sandbox Code Playgroud)

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


Tom*_*hik 6

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

kotlin.jvm.target.validation.mode = IGNORE
Run Code Online (Sandbox Code Playgroud)

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

对于我们大多数人来说,问题是目前无法升级到 kotlin 1.6.21。为了升级到 kotlin 1.6.21,您需要升级到 android gradle 7.4。要升级到 android gradle 7.4,您需要高于 Dolphin 的 Android Studio 版本 | 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


ahm*_*ira 6

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

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_17
        targetCompatibility JavaVersion.VERSION_17
    }
    kotlinOptions {
        jvmTarget = '17'
    }
Run Code Online (Sandbox Code Playgroud)


exp*_*ert 5

令人惊讶的是,罪魁祸首非常简单。你需要KotlinCompile先声明你的任务JavaCompile。像这样

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"
    }
}
Run Code Online (Sandbox Code Playgroud)