将 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 阅读更多关于多平台依赖管理的信息。
我已经在 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 阅读更多关于多平台依赖管理的信息。