为啥 kotlin gradle 插件无法使用 1.8 目标构建?

Posted

技术标签:

【中文标题】为啥 kotlin gradle 插件无法使用 1.8 目标构建?【英文标题】:Why kotlin gradle plugin cannot build with 1.8 target?为什么 kotlin gradle 插件无法使用 1.8 目标构建? 【发布时间】:2018-07-14 01:38:28 【问题描述】:

我有一个使用 intellij 为 kotlin 1.2.10 配置的最简单的 gradle 项目。这是我的 build.gradle 文件:

buildscript 
    ext.kotlin_version = '1.2.10'

    repositories 
        mavenCentral()
    
    dependencies 
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    


group 'com.ali'
version '1.0-SNAPSHOT'

apply plugin: 'java'
apply plugin: 'kotlin'

sourceCompatibility = 1.8

repositories 
    mavenCentral()


dependencies 
    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
    testCompile group: 'junit', name: 'junit', version: '4.12'


compileKotlin 
    kotlinOptions.jvmTarget = "1.8"

compileTestKotlin 
    kotlinOptions.jvmTarget = "1.8"

我有一个简单的 java 接口:

public interface MyMath 
    static int myAbs(int input) 
        return Math.abs(input);
    

当我导入此接口并尝试调用 myAbs 方法时,它会失败并出现以下错误:

Error:(6, 12) Kotlin: Calls to static methods in Java interfaces are prohibited in JVM target 1.6. Recompile with '-jvm-target 1.8'

我创建了一个 intellij kotlin 应用程序,它运行正常。这是新 Kotlin gradle 插件中的错误吗?

【问题讨论】:

你有 JDK 8 吗? 是的,这个问题只发生在我在 intellij 中构建项目时。终端中的 gradle 工作正常! 您使用的 IDE 插件版本是什么?我无法使用 1.2.21 插件重现错误。如果更新的 Gradle 和 IDE 插件版本也发生这种情况,您可以在 kotl.in/issue 提出问题并描述导致错误的确切步骤。 ***.com/a/60246275/4694013 【参考方案1】:

我认为这对在 Mac 上使用 android Studio 3.2 的用户会有所帮助。

要更改 Kotlin 编译器目标 JVM 版本,您应该转到 Android Studio -> 首选项 -> Kotlin 编译器,然后从下拉列表中选择更改目标 JVM 版本。

无论如何,我仍然收到以下错误

在 JVM 目标 1.6 中禁止调用 Java 接口中的静态方法。用'-jvm-target 1.8'重新编译

已解决

将以下内容添加到我的 build.gradle 解决了这个问题:

android 
    kotlinOptions 
        jvmTarget = '1.8'
    

关于这个和其他 Gradle 配置选项:https://kotlinlang.org/docs/reference/using-gradle.html


使用 Kotlin Gradle DSL:

import org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptions

(kotlinOptions as KotlinJvmOptions).apply 
    jvmTarget = JavaVersion.VERSION_1_8.toString()

【讨论】:

对于 Android 项目,Kotlin 编译器目标 JVM 版本需要在 build.gradle 中更改,而不是在 Android Studio 首选项中。 Android Studio 首选项的更改不会影响命令行构建。 谢谢你,很好的帮助@yole 感谢您的帮助,非常有帮助, 酷,它有帮助!顺便说一句,这是app's gradle。 是否可以在根 build.gradle 文件中进行设置?在多模块项目中跨模块管理这个很乏味。【参考方案2】:

原来是我在intellij设置中的kotlin编译器配置。在Settings > Build, Execution, Deployment > Compiler > Kotlin Compiler 中,名为Target JVM version 的设置应该设置为1.8。

【讨论】:

在我的版本中是Settings -> Other Settings -> Kotlin Compiler -> Target JVM Version 但即使设置为 1.8,我仍然得到Calls to static methods in Java interfaces are prohibited in JVM target 1.6. Recompile with '-jvm-target 1.8' 我没有Other Settings 就我而言,我在Project Structure -> Facets -> Kotling -> Target Platform修复它 实际上,我设置了以上所有内容,并且没有更多消息......但是。 IJ 2018.1.5 Kotlin 1.2.50.【参考方案3】:

Kotlin 插件有一个 gradle 属性可以使用。当你添加

kotlin.setJvmTargetFromAndroidCompileOptions = true

到您的gradle.properties 文件。 当您在 build.config 上进行此配置时

android
  compileOptions 
      sourceCompatibility = 1.8
      targetCompatibility = 1.8
  

问题解决了。

【讨论】:

我正在处理的项目配置了 sourceCompatibility targetCompatibility 但添加 kotlin.setJvmTargetFromAndroidCompileOptions = true 为我解决了问题 我把 kotlin.setJvmTargetFromAndroidCompileOptions = true 代码放在哪里?更具体的请 在任何级别的 gradle.properties 中【参考方案4】:

请检查你是否在idea中设置了以下三个东西:

    build.gradle 中的 kotlin 选项
    kotlinOptions 
        jvmTarget = '1.8'
    

    检查相关的 Idea 首选项

    检查项目方面

【讨论】:

【参考方案5】:

//只需在你的 Build gradle(Module:app) 中添加以下代码

compileOptions 
    sourceCompatibility = 1.8
    targetCompatibility = 1.8

tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all 
    kotlinOptions 
        jvmTarget = "1.8"
    
 

【讨论】:

是的,这对我有帮助。谢谢。【参考方案6】:

这在 Gradle 中使用 Kotlin DSL 对我有用:

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
val compileKotlin: KotlinCompile by tasks
compileKotlin.kotlinOptions.jvmTarget = JavaVersion.VERSION_11.toString()

【讨论】:

【参考方案7】:

这也是在项目设置中的Project Settings > Modules > Kotlin 下设置的。这是我的具体问题...实际上是我尝试的最后一件事。

【讨论】:

【参考方案8】:

Settings > Build, Execution, Deployment > Compiler > Kotlin Compiler 一个名为 Target JVM version 的设置应该设置为 1.8。

【讨论】:

谢谢大哥 :)【参考方案9】:

不太清楚为什么会这样,但您可以尝试更改 Idea 本身的设置。由于命令行中的 Gradle 可以工作,但从 IntelliJ 构建时却不行,这可能是根目录。

转到文件 -> 项目结构。转到 Project 选项卡并确保 Project SDK 为 8(或更高版本)并将 Project language level 设置为 Java 8

那里的配置似乎由于某种原因覆盖了 Gradle,因此更改它应该可以工作

【讨论】:

在我的智能中是 8! 尝试使缓存失效并重新启动 没用。我有一个使用较旧的 intellij 创建的项目(当前是 2017.3.4)。旧的正在工作。我正在比较两个项目的 .idea 文件夹。有意义吗? 我在 Maven 项目中遇到了同样的错误。刚刚解决了将 1.8 添加到属性部分。在这里查看youtrack.jetbrains.com/issue/KT-17492 了解更多信息 “项目语言级别”设置控制如何在 IDE 中突出显示 Java 源代码。它对 Kotlin 编译没有任何影响。【参考方案10】:

在我的情况下,我尝试了所有 @alisabzevari 选项,包括在评论中给出的选项,但它不起作用,

我的错误我也在src/<sourcset_name>kotlin/文件夹中添加了java文件,后来我将java文件转换为kotlin文件。瞧!有用。

也许它会帮助某人。

【讨论】:

【参考方案11】:

通过编辑build.gradle.kts解决了这个问题

val compileKotlin: KotlinCompile by tasks
compileKotlin.kotlinOptions.jvmTarget = "1.8"

【讨论】:

以上是关于为啥 kotlin gradle 插件无法使用 1.8 目标构建?的主要内容,如果未能解决你的问题,请参考以下文章

为啥gradle无法为flutter插件打开cp_proj重新映射的类缓存

IntelliJ 无法识别 Kotlin JPA 插件

带有 kotlin 设置问题的 Spring Boot gradle 项目

Gradle kotlin Springboot多模块导致无法引用kotlin的类文件(BootJar)

Gradle kotlin Springboot多模块导致无法引用kotlin的类文件(BootJar)

使用 kotlin 插件 jpa 构建配置失败