You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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机制实现跨平台适配:

  1. 在commonMain中定义通用接口:
expect interface Network<N, E> {
    // 定义你需要的图操作方法
}

expect fun createDirectedNetwork(): Network<Any, Any>
  1. 在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()
}
  1. 在iosMain中提供iOS平台的实现(可以自己写简单逻辑,或者找Native的图库替代):
actual class Network<N, E> {
    // 实现iOS平台的图逻辑
}

actual fun createDirectedNetwork(): Network<Any, Any> {
    return Network()
}

这样通用测试代码可以调用createDirectedNetwork(),不同平台会使用对应的实现,避免依赖JVM专属库。

内容的提问来源于stack exchange,提问作者Andy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 11:30:14