【问题标题】: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 提出问题并描述导致错误的确切步骤。

标签: gradle intellij-idea kotlin


【解决方案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中设置了以下三个东西:

  1. build.gradle 中的 kotlin 选项
    kotlinOptions {
        jvmTarget = '1.8'
    }
  1. 检查相关的 Idea 首选项

  2. 检查项目方面

【讨论】:

    【解决方案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"
          

          【讨论】:

            猜你喜欢
            • 2022-06-21
            • 1970-01-01
            • 2018-07-17
            • 1970-01-01
            • 1970-01-01
            • 2016-06-10
            • 1970-01-01
            • 1970-01-01
            • 2019-05-01
            相关资源
            最近更新 更多