为啥 Kotlin 插件为 Android 项目添加 kotlin-stdlib-jre7(不是 kotlin-stdlib)参考
Posted
技术标签:
【中文标题】为啥 Kotlin 插件为 Android 项目添加 kotlin-stdlib-jre7(不是 kotlin-stdlib)参考【英文标题】:Why Kotlin plugin adds kotlin-stdlib-jre7 (not kotlin-stdlib) reference for Android project为什么 Kotlin 插件为 Android 项目添加 kotlin-stdlib-jre7(不是 kotlin-stdlib)参考 【发布时间】:2018-02-07 20:19:35 【问题描述】:android Studio 2.3.3; Kotlin 插件:1.1.4; Kotlin 编译器:Kotlin 到 JVM:1.6。
Android Studio > 新建项目 > 在项目操作中配置 Kotlin 添加 kotlin-stdlib-jre7 到 gradle 文件的参考。 我希望 kotlin-stdlib 因为我们的 Kotlin 目标 JVM 是 1.6。
还没有找到好的解释。 例如。 this answer 声明
kotlin-stdlib-jre7 工件不应该在 Android 上运行,Android 目前仅支持 Java 6 平台。面向 Android 时,您应该使用为 JRE 6 构建的 kotlin-stdlib
【问题讨论】:
【参考方案1】:Android 已经支持 Java 7 好几年了。事实上,对 Java 8 的部分支持正在进行中,一开始是通过Jack toolchain,现在是通过desugaring in the default toolchain。
所以,kotlin-stdlib-jre7
完全没问题。
正如您在this answer 中看到的那样,kotlin-stdlib
在 1.1 中有两个额外的扩展库 kotlin-stdlib-jre7
和 kotlin-stdlib-jre8
。该库为 Java 7 和 Java 8 添加了特定功能,并包含 kotlin-stdlib
作为传递依赖项。另见Kotlin 1.1 release notes:
Java 8 标准库支持
现在有不同版本的标准库支持 Java 7 和 8 中添加的新 JDK API。如果您需要访问新 API,请使用 kotlin-stdlib-jre7 和 kotlin-stdlib-jre8 maven artifacts 而不是标准的 kotlin-stdlib。这些工件是 kotlin-stdlib 之上的微小扩展,它们将其作为传递依赖项带到您的项目中。
当前版本的 Android Studio 中的 Kotlin 插件在项目中配置 Kotlin 时添加了 kotlin-stdlib-jre7
作为依赖项,因为自 Android Studio 0.3.2, released in October 2013 以来,Android Studio 和构建工具以向后兼容的方式支持 Java 7。另见Does Android support JDK 6 or 7。具体来说,发行说明指出:
此版本的主要功能是支持 Android KitKat:
支持菱形运算符、multi-catch、try-with-resources、switch 中的字符串等语言功能。 创建新项目时,您可以指定源语言级别:
还有:
请注意,您不仅可以在 Android KitKat 中使用所有这些语言功能,还可以在旧版本的 Android 中使用!有一个例外:try-with-resources,它需要 minSdkVersion 19。
【讨论】:
您说“kotlin-stdlib-jre7 非常好”,上面的答案说“不应该使用 kotlin-stdlib-jre7”。实际上我正在寻找一些参考来解释何时使用 kotlin-stdlib 或 kotlin-stdlib-jre7 的规则 我在我的项目中使用kotlin-stdlib-jre7
,这就是为什么我可以确认它有效。话虽如此,我不知道为什么您链接的答案是说 Android 不支持 Java 7。正如我在回答中所说,甚至部分支持 Java 8 测试版(通过“脱糖”过程,其中将 Java 8 语言功能转换为 Java 7)。此外,在这里您还有另一个 SO 问题说它受支持:[***.com/questions/20480090/…Android 支持 JDK 6 或 7)。希望这能让事情更清楚。
kotlin-stdlib
在 1.1 中没有被拆分。这些kotlin-stdlib-jre7
和-jre8
是包含新API 的附加工件。
上面的 Kotlin 语言文档 sn-p 不是 Android 特定的。文档适用于所有 Kotlin 支持的平台。当您针对 JDK 7 或 JDK 8 时,AFAIU kotlin-stdlib-jre7/kotlin-stdlib-jre8 是正确的选择。我的目标是 Java 6。If you're targeting JDK 7 or JDK 8, you can use extended versions of the Kotlin standard library which contain additional extension functions for APIs added in new JDK versions. Instead of kotlin-stdlib , use one of the following dependencies
是的,我们谈论的是 Android,项目 minSdkVersion 是 21。我的目标是 Java 6 在 Kotlin 方面。项目设置:Kotlin 编译器针对 JVM 版本 1.6。我假设这意味着编译器将生成 Java 6 字节码,而 Java 7 库在这种情况下不适用。真的很感谢你的帮助。我可能不够聪明,无法理解。如果没有其他解释,我会接受你的回答。以上是关于为啥 Kotlin 插件为 Android 项目添加 kotlin-stdlib-jre7(不是 kotlin-stdlib)参考的主要内容,如果未能解决你的问题,请参考以下文章
为啥 kotlin gradle 插件无法使用 1.8 目标构建?