为啥 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 项目中遇到了同样的错误。刚刚解决了将在我的情况下,我尝试了所有 @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重新映射的类缓存
带有 kotlin 设置问题的 Spring Boot gradle 项目
Gradle kotlin Springboot多模块导致无法引用kotlin的类文件(BootJar)