Kotlin 编译器构建错误 使用 -jvm-target 1.8 重新编译



我正在处理以下问题中描述的相同错误,但提出的所有解决方案都没有解决我的问题。

为什么 Kotlin gradle 插件不能使用 1.8 目标构建?

Android Studio 在 Kotlin 项目中抛出构建错误,该错误在 Java 接口中调用静态方法

Intellij 拒绝将 Kotlin 目标 jvm 设置为 1.8?

就我而言,差异很小。我使用的是 Android Studio 3.5,最近将 Kotlin 版本升级到 1.3.61 最初我收到通常的错误消息:

calls to static methods in Java interfaces are prohibited in JVM target 1.6. Recompile with '-jvm-target 1.8'

我更改了文件 -> 设置 ->Kotlin 编译器 -> 目标 JVM 版本,在此更改后编译时没有错误,但后来当我尝试在模拟器上部署时,构建再次失败。因此,当它构建应用程序时它可以工作,当它执行完整构建以部署它失败时,但理论上他们使用相同的配置。当我在 gradle 窗口中单击设置时,无论选择什么节点,它都会打开主设置的同一窗口。能有什么区别? 我检查了所有可能的设置和配置,还检查了项目结构和构建/运行/调试模板,但我找不到可以设置属性的其他地方。 我试图在 gradle 构建中设置 JvmTarget,但在这个 Kotlin 版本中,该属性不再存在。我想到了下载问题,并将mavenCentral添加到存储库中,但没有任何变化。如果最近发生了某些变化,则此页面似乎不是最新的: https://kotlinlang.org/docs/reference/using-gradle.html 我还能尝试什么?为什么只有完整构建失败?

更新:

目前,我通过添加非静态方法解决了这个问题,但它会降低性能。所以我希望解决方案迟早会出现。同时,我正在添加构建文件,尽管我认为它不会为问题的描述增加很多内容:

//Originally the plugins were declared with the syntax "apply plugin ...."
//Changing to this form did not change the result
plugins {
id('com.android.application')
id('org.jetbrains.kotlin.android')
id('org.jetbrains.kotlin.android.extensions')
}
android {
compileSdkVersion 29
buildToolsVersion "29.0.2"
defaultConfig {
applicationId ..........
minSdkVersion 23
targetSdkVersion 29
versionCode 1
versionName "1.0"
multiDexEnabled true
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility = 1.8
targetCompatibility = 1.8
}
// Commented out because the property JvmTarget is not found with Kotlin 1.3.61
//    compileReleaseKotlin {
//        JvmTarget='1.8'
//    }
//    compileDebugKotlin {
//        JvmTarget='1.8'
//    }
lintOptions {
abortOnError false
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
//I tried also JDK 7
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
implementation 'androidx.appcompat:appcompat:1.0.2'
implementation 'androidx.core:core-ktx:1.0.2'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
//Follow other dependencies which are irrelevant
// ...
}

更新

最新版本的 Kotlin 插件允许您将kotlinOptions放入android块中。使用 Kotlin 1.4.20 和 Gradle 6.7 对此进行了测试。

android {
// ...
kotlinOptions {
jvmTarget = "1.8"
}
}

原答案

将其放在build.gradle文件中android块的外部:

格拉德尔
compileKotlin {
kotlinOptions {
jvmTarget = "1.8"
}
}
Gradle KTS
tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> {
kotlinOptions {
jvmTarget = "1.8"
}
}

请注意,jvmTarget中的小j和缺少变体名称 - 这将适用于所有构建变体。

确保正确设置 jvmTarget:

对于源,它将是:

compileKotlin {
kotlinOptions.jvmTarget = "1.8"
}

对于测试,它将是:

compileTestKotlin {
kotlinOptions.jvmTarget = "1.8"
}