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

ali*_*ari 56 intellij-idea gradle kotlin

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

我有一个简单的java界面:

public interface MyMath {
    static int myAbs(int input) {
        return Math.abs(input);
    }
}
Run Code Online (Sandbox Code Playgroud)

当我导入此接口并尝试调用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'
Run Code Online (Sandbox Code Playgroud)

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

Jai*_*ano 105

我认为这对那些在Mac上使用Android Studio 3.2的用户有帮助.

要更改Kotlin Compiler Target JVM版本,您应该转到Android Studio - > Preferences - > Kotlin Compiler,然后从下拉列表中选择Target JVM版本.

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

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

解决了

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

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

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

  • 对于Android项目,需要在build.gradle中更改Kotlin编译器目标JVM版本,而不是在Android Studio首选项中.Android Studio首选项中的更改不会影响命令行构建. (15认同)
  • 酷,有帮助!顺便说一句,它是“app”的 gradle。 (2认同)
  • 是否可以在根 build.gradle 文件中设置它?在多模块项目中跨模块管理它是很乏味的。 (2认同)

ali*_*ari 49

事实证明,这是我在intellij设置中的kotlin编译器配置.在Settings > Build, Execution, Deployment > Compiler > Kotlin Compiler一个名为Target JVM versionshould 的设置中应该设置为1.8.

  • 在我的例子中,我将其修复为"项目结构 - >构面 - > Kotling - >目标平台" (32认同)
  • 在我的版本中,它位于 `Settings -> Other Settings -> Kotlin Compiler -> Target JVM Version` (5认同)
  • 但即使设置为1.8,我仍然会得到`在JVM目标1.6中禁止调用Java接口中的静态方法.用'-jvm-target 1.8'重新编译 (4认同)

Kar*_*aka 23

可以使用 Kotlin 插件使用的 gradle 属性。当你添加

kotlin.setJvmTargetFromAndroidCompileOptions = true
Run Code Online (Sandbox Code Playgroud)

到您的gradle.properties文件。当你有这个配置时build.config

android{
  compileOptions {
      sourceCompatibility = 1.8
      targetCompatibility = 1.8
  }
}
Run Code Online (Sandbox Code Playgroud)

问题应该可以解决。

  • 我正在开发的项目配置了“sourceCompatibility”和“targetCompatibility”,但添加“kotlin.setJvmTargetFromAndroidCompileOptions = true”解决了我的问题 (2认同)

小智 13

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

compileOptions {
    sourceCompatibility = 1.8
    targetCompatibility = 1.8
}
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all {
    kotlinOptions {
        jvmTarget = "1.8"
    }
 }
Run Code Online (Sandbox Code Playgroud)


Ant*_*ila 6

请检查您是否设定了以下三个方面:

  1. build.gradle中的kotlin选项
    kotlinOptions {
        jvmTarget = '1.8'
    }
Run Code Online (Sandbox Code Playgroud)
  1. 检查相关的想法首选项 优先

  2. 检查项目方面 在此处输入图片说明


Ayu*_*ush 5

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

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