【问题标题】:Using Kotlin libraries as dependencies in a Java project在 Java 项目中使用 Kotlin 库作为依赖项
【发布时间】: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 模块,有人吗?)。

标签: java maven kotlin shared-libraries


【解决方案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 解决方案(见标签)。
猜你喜欢
  • 2018-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-19
  • 2013-12-06
  • 1970-01-01
  • 1970-01-01
  • 2021-09-08
相关资源
最近更新 更多