Idea 不断将 Kotlin 的编译目标从 1.8 切换到 1.6

Posted

技术标签:

【中文标题】Idea 不断将 Kotlin 的编译目标从 1.8 切换到 1.6【英文标题】:Idea keeps switching compile target from 1.8 to 1.6 for Kotlin 【发布时间】:2019-03-25 08:40:40 【问题描述】:

我正在使用 Intellij Idea 开发一个基于 Maven 和 JDK 8 的新 Kotlin 项目。一切都很好,除了每次 Maven 重新导入编译目标由于某种原因从 1.8 切换到 1.6 之后。

我确实尝试了从 2 个最佳答案到 same problem(尽管来自 Java 世界)的所有内容,但对我没有任何帮助。我也迁移到 Gradle,希望能克服这个问题,但这也无济于事。除了提到的 SO 问题之外,我浏览了很多论坛,建议总是与提到的 SO 答案中的相同。

那么问题来了,如何防止Idea在重新导入后切换目标Java版本?

【问题讨论】:

【参考方案1】:

所以经过多次尝试和错误尝试后,我发现 Idea 选择了 1.6 版本,因为这是 Kotlin 的默认 JVM 目标版本,我没有在 pom.xml 中的任何位置设置该 1.8 版本,或者build.gradle。如果此处未定义此版本,Idea 显然倾向于忽略项目设置并坚持默认设置。

这意味着解决方案是手动设置 kotlin 插件中的版本,但首先确保您已完成question dealing with the same problem but in Java 接受的答案中列出的所有内容。

现在,假设您使用的是 Gradle(我在迁移后一直使用它),您应该按照说明将 kotlin 插件包含在您的 build.gradle 中在kotlin's docu on how to use it with Gradle。但这还不够,因此您必须在该文档中向下滚动并找到kotlin compile options,尤其是jvmTarget。在那里你会发现 1.6 版本确实是默认的,你可以继续在 build.gradle 中配置你的编译任务:

compileKotlin kotlinOptions.jvmTarget = 1.8

瞧,现在每次重新导入都坚持 1.8。如果您使用 Maven,您还可以使用一个插件(只需 google 即可),我相信您可以使用相同的 jvmTarget 设置,尽管我还没有尝试过。

【讨论】:

对我来说,即使使用此 kotlinOptions 设置,导入后模块的 Kotlin 方面的版本也会更改回 1.6。我将它的格式设置为不同的格式,即使使用这个确切的字符串,逐个字节,它也不起作用。可能因为它是一个子模块而损坏了。 @DaliborFilus 你能告诉我你的 build.gradle 吗?也许在聊天中? gist.github.com/NoICE/7951025d72d5b2e79e812e39fa86d0f2 我认为这个问题只是它,他们试图一次又一次地修复它......youtrack.jetbrains.com/issue/KT-24662 @DaliborFilus 您的源和测试源是否在标准文件夹中? (src/main/kotlin 等) 这并不能解决我的问题。 Intellij 在我的构建文件发生任何更改后重置更改。 gradle这个想法还有其他神奇的咒语吗?我有一个多模块项目,这可能会增加问题。【参考方案2】:

解决方法:

  compileKotlin 
    kotlinOptions.jvmTarget = 1.8
  

如果这对您不起作用,请运行“compileKotlin”任务并检查输出。构建脚本中可能存在其他一些错误,导致无法应用此选项。

【讨论】:

以上是关于Idea 不断将 Kotlin 的编译目标从 1.8 切换到 1.6的主要内容,如果未能解决你的问题,请参考以下文章

idea编译工程时出现Error:java: 无效的目标发行版: 1.8?

kotlin可以编译成c代码吗

Kotlin 字节码 - 如何在 IntelliJ IDEA 中分析?

maven编译java项目问题(主要针对idea)——Error:java: 无效的目标发行版: 1.8

错误记录Kotlin 编译报错 ( Type mismatch: inferred type is String? but String was expected )

错误记录Kotlin 编译报错 ( Class ‘Xxx‘ is not abstract and does not implement abstract member )