在 Java 项目中使用 Kotlin 库作为依赖项

Posted

技术标签:

【中文标题】在 Java 项目中使用 Kotlin 库作为依赖项【英文标题】:Using Kotlin libraries as dependencies in a Java project 【发布时间】:2019-02-03 19:30:19 【问题描述】:

我有一个为其他项目提供共享功能的库项目。实现是用 Kotlin 编写的。但是,我确保库的公共接口不使用 Kotlin 提供的任何类。

如果我们将此库作为依赖项添加到纯 Java 项目,它会传递地引入 kotlin-stdlibkotlin-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 库作为依赖项的主要内容,如果未能解决你的问题,请参考以下文章

如何将 java 库添加到 kotlin 本机

Kotlin 通用库可在多个 MPP 中重用

项目引用Kotlin与databinding,ARouter,Architecture Components冲突解决办法

将 Kotlin 运行时库添加到 android 中的 aar

在 Kotlin MultiPlatform 项目中未解决 iOS 依赖项

使用 Kotlin 时是不是有适用于 iOS 的 WebSocket 客户端库?