Kotlin Multiplatform iOS端无法使用Guava库的问题求助
问题
使用Kotlin Multiplatform开发同时支持Android和iOS的应用时,执行iosSimulatorArm64测试任务,以下导入语句报未解析引用错误:
import com.google.common.graph.NetworkBuilder
当前build.gradle.kts配置
plugins { kotlin("multiplatform") id("com.android.library") } kotlin { androidTarget { compilations.all { kotlinOptions { jvmTarget = "1.8" } } } listOf( iosX64(), iosArm64(), iosSimulatorArm64() ).forEach { it.binaries.framework { baseName = "shared" } } sourceSets { commonTest { dependencies { implementation(kotlin("test-common")) implementation(kotlin("test-annotations-common")) implementation("com.google.guava:guava:33.0.0-jre") implementation("com.google.guava:guava:33.0.0-android") } } val androidUnitTest by getting { dependencies { implementation(kotlin("test-junit")) implementation("junit:junit:4.13.2") } } } } android { compileSdk = 34 sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml") defaultConfig { minSdk = 21 } namespace = "com.jetbrains.android" compileOptions { sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 } }
原因及解决方案
问题根源
Guava的com.google.common.graph是JVM专属API,你当前在commonTest中引入的guava:33.0.0-jre和guava:33.0.0-android都是JVM平台依赖,无法在iOS(Native)环境中被识别,所以iOS测试任务会找不到对应的类。
解决方法
方案1:仅在Android测试中引入Guava
将Guava依赖从commonTest移到androidUnitTest,这样只有Android测试会使用Guava,iOS测试不受影响:
sourceSets { commonTest { dependencies { implementation(kotlin("test-common")) implementation(kotlin("test-annotations-common")) } } val androidUnitTest by getting { dependencies { implementation(kotlin("test-junit")) implementation("junit:junit:4.13.2") implementation("com.google.guava:guava:33.0.0-android") } } }
方案2:用expect/actual封装跨平台图逻辑
如果需要在通用代码(包括测试)中使用图相关功能,通过KMM的expect/actual机制实现跨平台适配:
- 在
commonMain中定义通用接口:
expect interface Network<N, E> { // 定义你需要的图操作方法 } expect fun createDirectedNetwork(): Network<Any, Any>
- 在
androidMain中用Guava实现:
import com.google.common.graph.NetworkBuilder actual typealias Network<N, E> = com.google.common.graph.Network<N, E> actual fun createDirectedNetwork(): Network<Any, Any> { return NetworkBuilder.directed().build() }
- 在
iosMain中提供iOS平台的实现(可以自己写简单逻辑,或者找Native的图库替代):
actual class Network<N, E> { // 实现iOS平台的图逻辑 } actual fun createDirectedNetwork(): Network<Any, Any> { return Network() }
这样通用测试代码可以调用createDirectedNetwork(),不同平台会使用对应的实现,避免依赖JVM专属库。
内容的提问来源于stack exchange,提问作者Andy
相关产品推荐
相关产品推荐

