提问人:jitendra kumar 提问时间:9/7/2021 最后编辑:Donald Duckjitendra kumar 更新时间:11/24/2023 访问量:190451
如何在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?
问:
构建.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 {
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 中。
评论
tasks.withType<>
Could not get unknown property 'withType' for task set of type org.gradle.api.internal.tasks.DefaultTaskContainer
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile) {
kotlin("jvm")
build.gradle.kts
tasks.withType<T> { ... }
tasks.withType(T) {
java.toolchain.languageVersion.set(JavaLanguageVersion.of(17))
@Marian的回答对我没有太大帮助。
我最终在应用程序build.gradle中设置了以下内容
android {
...
compileOptions {
sourceCompatibility JavaVersion.VERSION_11
targetCompatibility JavaVersion.VERSION_11
}
kotlinOptions {
jvmTarget=11
}
...
}
评论
如果有人不断收到有关将 java 编译任务设置为 java 1.8 的警告,您可以将其添加到 gradle 脚本中:
afterEvaluate {
tasks.withType<JavaCompile>().configureEach {
sourceCompatibility = JavaVersion.VERSION_11.toString()
targetCompatibility = JavaVersion.VERSION_11.toString()
}
}
我在 AS 上收到一些 java 编译任务的警告,这为我解决了它。
这对我来说效果很好:
kotlin {
jvmToolchain {
languageVersion.set(JavaLanguageVersion.of("11"))
}
}
这样我只需要设置一次。
评论
languageVersion
(this as JavaToolchainSpec).languageVersion
这个解决方案对我有用:
只需替换语句(或类似内容):
kotlinOptions {
jvmTarget = JavaVersion.VERSION_1_8.toString()
}
跟
kotlinOptions {
jvmTarget = "1.8"
}
在所有模块级别文件中,然后同步 Gradle 。build.gradle
希望这能奏效。祝您编码愉快......!
令人惊讶的是,罪魁祸首非常简单。您需要在 之前声明您的任务。喜欢这个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"
}
}
需要应用 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-plugin 和 https://developer.android.com/studio/releases#android_gradle_plugin_and_android_studio_compatibility
为了在“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)
科特林:
- Android Kotlin 插件:221 ( 221-1.8.0-release-for-android-studio-AS5591.52 )
(请参阅 https://kotlinlang.org/docs/whatsnew18.html#install-kotlin-1-8-0 ) - Kotlin Gradle 插件:org.jetbrains.kotlin:kotlin-gradle-plugin:1.8.0
关于新语法:
请参阅 JVM 工具链配置的新方法
注意:
有关 Kotlin 配置的更多信息,请访问:https://blog.jetbrains.com/kotlin/2021/11/gradle-jvm-toolchain-support-in-the-kotlin-plugin/
评论
kotlinOptions { jvmTarget = "11" }
jvmToolchain(11)
allprojects {
tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile>().configureEach {
kotlinOptions {
jvmTarget = JavaVersion.VERSION_1_8.toString()
}
}
}
通过将此任务包含在 build.gradle 中,告诉编译器在您的项目中使用 JavaVersion = 1.8。
评论
我们还需要注意错误显示的版本。就我而言,它是:
原因: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 需要这样的事情
评论
将 Android Studio 更新到 Flamingo 版本后,我遇到了同样的问题,这是我在 build.gradle 中的新配置
compileOptions {
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = '17'
}
我通过更新gradle.properties文件中的配置解决了这个问题。
改变
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip
自
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip
我首先尝试了所有模块的以下代码
compileOptions {
sourceCompatibility = '1.8'
targetCompatibility = '1.8'
}
kotlinOptions {
jvmTarget = '1.8'
}
在gradle.properties中添加以下行后,解决了这个问题。
kotlin.jvm.target.validation.mode = IGNORE
评论
几乎所有的答案都彼此之间有微小的差异,我的也是如此。
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlin {
jvmToolchain(8)
}
这对我有用。看起来工具链默认为不同的值,否则,这会覆盖以匹配编译选项并解决问题。
其中一个非常相似的错误可能是这样的。 任务“: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'
}
希望这将解决错误。
我经历过相同的情况,并尝试了上面提到的不同变体。我遇到的奇怪行为是,项目在第一次尝试时成功构建,但在尝试再次构建时再次出现相同的错误。
幸运的是,我找到了解决该问题的解决方法。通过将 Gradle 版本从 8.0 恢复到 7.5,问题得到了解决,我能够构建项目而不会出现任何进一步的错误。
评论
对于任何已经做了所有事情但仍在与此问题作斗争的人,请尝试降级您的 gradle 版本。就我而言,我将 8.0 更改为 7.5,它有所帮助。
- 从 AndroidManifesty 的 manifest 标记中删除软件包.xml
- 将以下命令添加到项目的 gradle.properties 中:
kotlin.jvm.target.validation.mode = 忽略 3. 确保 kotlinOptions 已在 compileOptions 旁边设置: 编译选项 { source兼容性JavaVersion.VERSION_1_8 target兼容性JavaVersion.VERSION_1_8 } kotlin选项 { jvmTarget = '1.8' }
我通过使用相同的 Java 版本解决了这个问题:
compileOptions {
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = '17'
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
}
kotlinOptions {
jvmTarget = "11"
}
将此包导入到 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
所以,这里似乎有一个奇怪的特例,在 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% 可重现的),因此您会在步骤中得到如下内容:kapt
1.8+
jvmTarget
kaptGenerateStubs
> 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"
}
我看到在其他答案中,建议使用 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"
}
}
这将解决问题。
评论