将 jvm 模块导入为 kotlin 多平台依赖项

Import jvm module as kotlin multiplatform dependency

我已经在 Kotlin 中构建了一个库,我想在 Kotlin 后端、Android 应用程序和 swift ios 应用程序中使用它。 Lib 是用纯 Kotlin 编写的,它由 3 个相互依赖的模块组成。要创建它的 multiplatform/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 模块导入多平台模块?

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

多平台模块有不同的源集:通用、JVM、JS 和原生的,如 iOS。

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

如果你想从像 iOS 这样的平台特定模块使用多平台库,那个“消费者”模块将只能访问公共代码和 iOS-特定代码多平台图书馆。 由于它将在 iOS 上 运行,因此模块无法传递地使用 JVM 模块(它不会有 JVM 运行时)。

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

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