【问题标题】:Import jvm module as kotlin multiplatform dependency将 jvm 模块导入为 kotlin 多平台依赖项
【发布时间】:2021-06-22 07:57:46
【问题描述】:

我在 Kotlin 中构建了一个库,我想在 Kotlin 后端、Android 应用程序和 swift ios 应用程序中使用它。 Lib 是用普通的 Kotlin 编写的,它由 3 个相互依赖的模块组成。为了创建它的多平台/ios 版本,我使用 build.gradle.kts 创建了单独的模块:

plugins {
    kotlin("multiplatform")
}
kotlin {
    sourceSets {
        val commonMain by getting {
            dependencies {
                implementation("org.jetbrains.kotlin:kotlin-stdlib-common")
                implementation(project(":myJvmModule"))
            }
        }
    }
    iosArm64 { binaries.framework("NativeFramework") }
    iosX64 { binaries.framework("NativeFramework") }

    tasks {
      ...
    }
}

tasks.withType<Wrapper> {
    gradleVersion = "5.3.1"
    distributionType = Wrapper.DistributionType.ALL
}

除此之外,myJvmModule 还有 build.gradle.kts:

val fasterXmlVersion: String by project

plugins {
    kotlin("jvm")
}

dependencies {
    // Modules
    implementation(project(":myAnotherModule"))
    implementation(project(":myAnotherModule2"))

    // Jackson
    implementation(group = "com.fasterxml.jackson.module", name = "jackson-module-kotlin", version = fasterXmlVersion)
}

无论我如何尝试使用 myJvmModule 作为依赖项,我总是收到错误: Could not resolve company:myJvmModule:0.0.1 如何将 JVM 模块导入多平台模块?

【问题讨论】:

    标签: ios kotlin-multiplatform


    【解决方案1】:

    我不确定我是否完全理解您的问题。如果您的意图是从本机模块传递使用 JVM 模块,那根本不可能。

    多平台模块有不同的源集:common、JVM、JS 和 iOS 等原生模块。

    在多平台模块中,您只能依赖 JVM 源集中的 JVM 模块。但请注意,这种依赖关系仅适用于多平台库的 JVM “风味”,而不适用于 iOS。

    如果您想使用来自特定平台模块(如 iOS)的多平台库,该“消费者”模块将只能访问多平台库的通用代码和 iOS 特定代码。 由于它将在 iOS 上运行,因此该模块无法传递使用 JVM(它不会有 JVM 运行时)。

    我想您最好的选择(如果您控制 JVM 模块)也是将您的 JVM 模块变成一个多平台模块。那里使用的任何 JVM 库都需要替换为多平台等效项,或者需要为本机目标添加本机等效项。如果您选择后者,您可能必须在公共代码中定义一个公共 API,并使用use expect/actual declarations 将公共代码映射到特定于平台的代码。

    您可以在the official doc 中阅读有关多平台依赖管理的更多信息。

    【讨论】:

    • 我想要将我的代码编译为 .h 文件,我将能够在现有的 iOS Swift 项目中使用这些文件。但是,我要编译为 .h 文件的 lib 需要依赖于另一个模块 - myJvmModule
    • Kotlin 多平台本身无法做到这一点,这不是它的设计用途。多平台可以提供帮助的方式是提供编写通用代码并在平台之间共享代码的可能性。但它不允许您在另一个平台上使用特定于平台的代码。您不能在本机项目中使用 JVM 模块 (myJvmModule)。
    • 是否可以在多平台模块中使用任何 maven 存储库库?即“com.fasterxml.jackson.module:jackson-module-kotlin:2.12.3”
    • 有些 maven 库是多平台的,有些则不是。 Jackson 是一个纯粹的 JVM 库,它不能用于通用代码,也不能用于 JVM 以外的任何其他平台。 jackson-module-kotlin 也是 JVM 专用的,仅用于向 Jackson 添加功能以处理 Kotlin 特定的细微之处(它仅适用于 Kotlin/JVM)。如果你需要多平台 JSON 序列化/反序列化,你应该看看kotlinx-serialization
    • 此外,如果您仅将 JSON 用于网络请求的负载,您可能希望完全查看多平台 HTTP 客户端,例如 Ktor。这样您就可以跨不同平台重用整个客户端
    猜你喜欢
    • 2021-12-27
    • 2020-04-30
    • 1970-01-01
    • 2021-04-27
    • 1970-01-01
    • 1970-01-01
    • 2013-08-15
    • 2020-04-30
    • 1970-01-01
    相关资源
    最近更新 更多