在 Java 项目中使用 Kotlin 库作为依赖项
Posted
技术标签:
【中文标题】在 Java 项目中使用 Kotlin 库作为依赖项【英文标题】:Using Kotlin libraries as dependencies in a Java project 【发布时间】:2019-02-03 19:30:19 【问题描述】:我有一个为其他项目提供共享功能的库项目。实现是用 Kotlin 编写的。但是,我确保库的公共接口不使用 Kotlin 提供的任何类。
如果我们将此库作为依赖项添加到纯 Java 项目,它会传递地引入 kotlin-stdlib
和 kotlin-runtime
。 Kotlin-stdlib 中的类现在可能(但错误地)用于纯 Java 消费者项目中。
有没有办法防止这种类型的泄漏?我能想到的一些选项:
在 Maven 中将 kotlin-stdlib-*
标记为 provided
: 这会在运行时导致任何问题吗? (ClassNotFoundException
等)
Shade + relocate kotlin-stdlib-*
和/或 kotlin-runtime
: 如果我们依赖多个 Kotlin 库项目,我可以预见到使用着色时会出现问题。另外,我不确定这是否真的会隐藏 Kotlin 类型。
注意:问题Using a kotlin library in java code 不适用于此处(误导性标题)。我特别避免这种情况。
【问题讨论】:
这听起来更像是 IDE 配置问题,而不是构建问题。你用的是什么IDE?当您说“[...] 他们现在看到模棱两可的库类型 [...]”时,您是指自动完成和导入语句吗? @RobbyCornelissen,我的目的是防止 Kotlin stdlib 类在 Java 项目中可用。其他一切都是装饰性的。 如果它们不可用,你的 Kotlin 库如何使用它们? @RobbyCornelissen,是的,这就是问题所在。我想不出封装这些依赖项的方法,因此它们仅可用于我的库实现(Java 9 模块,有人吗?)。 【参考方案1】:使用implementation
关键字声明您的库依赖项是否不足以传递它们?如hereWe use the implementation dependency configuration so that we don’t expose any of the Kotlin standard library through our API. This has architectural and performance benefits.
所说的
【讨论】:
implementation
关键字是 Gradle 特有的,对吧?我正在寻找一个 Maven 解决方案(见标签)。以上是关于在 Java 项目中使用 Kotlin 库作为依赖项的主要内容,如果未能解决你的问题,请参考以下文章
项目引用Kotlin与databinding,ARouter,Architecture Components冲突解决办法
将 Kotlin 运行时库添加到 android 中的 aar