为什么Kotlin Gradle插件无法使用1.8 Target构建?


92

我有使用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吗?
Zoe

是的,仅当我在intellij中构建项目时才会发生此问题。gradle在终端工作正常!
alisabzevari

您使用的IDE插件版本是什么?我无法使用1.2.21插件重现该错误。如果更新的Gradle&IDE插件版本也发生这种情况,则可以在kotl.in/issue中提出问题,并描述导致错误的确切步骤。
热键

Answers:


178

我认为这可能对在Mac上使用Android Studio 3.2的用户有所帮助。

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

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

JVM target 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()
}

20
对于Android项目,需要在build.gradle中而不是在Android Studio首选项中更改Kotlin编译器目标JVM版本。Android Studio首选项中的更改不会影响命令行构建。
yole

1
感谢您的帮助,@
yole提供了

感谢您提供的帮助,
lotosbin '18

2
太酷了,有帮助!和它的app的gradle这个BTW。
Wesely

2
是否可以在build.gradle根文件中进行设置?在多模块项目中跨模块进行管理很麻烦。
robotsquidward

75

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


3
在我的版本中Settings -> Other Settings -> Kotlin Compiler -> Target JVM Version
-ElyashivLavi

6
但是即使将其设置为1.8,我仍然会得到Calls to static methods in Java interfaces are prohibited in JVM target 1.6. Recompile with '-jvm-target 1.8'
ElyashivLavi

我没有Other Settings我!
alisabzevari

38
在我来说,我将其固定Project Structure -> Facets -> Kotling -> Target Platform
巴勃罗巴斯蒂达斯

实际上,我设置了以上所有内容,但没有其他消息...。IJ 2018.1.5科特林1.2.50。
softjake

21

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

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

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


15

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

kotlin.setJvmTargetFromAndroidCompileOptions = true

到您的gradle.properties文件。当您具有此配置时build.config

android{
  compileOptions {
      sourceCompatibility = 1.8
      targetCompatibility = 1.8
  }
}

解决的问题。


我工作过的项目sourceCompatibility targetCompatibility配置,但加入kotlin.setJvmTargetFromAndroidCompileOptions = true解决了这个问题对我来说
FDO

6

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

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

1

不太确定为什么会这样,但是您可以尝试更改Idea本身的设置。由于可以从命令行使用Gradle,但不能从IntelliJ进行构建时,这可能就是根源。

转到文件->项目结构。转到“项目”标签,并确保Project SDK为8(或更高版本),然后将设置Project language level为Java 8。

在此处输入图片说明

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


在我的intellij中是8!
alisabzevari

尝试使缓存无效并重新启动
Zoe

没用 我有一个使用较旧的intellij创建的项目(当前为2017.3.4)。旧的正在工作。我正在相互比较两个项目的.idea文件夹。是否有意义?
alisabzevari

2
我在Maven项目中遇到了相同的错误。刚刚解决了将<kotlin.compiler.jvmTarget> 1.8 </kotlin.compiler.jvmTarget>添加到属性部分的问题。看看这里youtrack.jetbrains.com/issue/KT-17492了解更多信息
Paolo

“项目语言级别”设置控制在IDE中如何突出显示Java源代码。它对Kotlin编译没有任何影响。
yole

1

也可以在项目设置下的进行设置Project Settings > Modules > Kotlin。这是我的特定问题...实际上是我尝试的最后一件事。


1

在Gradle中使用Kotlin DSL为我工作:

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

0

就我而言,我尝试了所有@alisabzevari选项(包括注释中给出的选项),但没有成功,

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

可能会有所帮助。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.