无法在KMM库项目中正确生成并使用KMP库
问题分析与解决方案
核心问题
你的配置存在两个关键问题:
- 多平台依赖解析机制未被正确利用:直接通过
files()引入单个jar文件,Gradle无法识别KMP库的多平台变体关联关系,导致common模块无法正确找到对应的实现,iOS模块也没有拿到实际的平台代码。 - iOS平台依赖配置错误:你给iOS架构引入的是
metadata.jar,这只是KMP库的元数据文件,不包含iOS平台的实际编译代码,真正的iOS产物应该是.framework格式的文件。
正确的解决方法
推荐两种更可靠的方式,优先选择第一种:
方式一:发布到本地Maven仓库(最稳定)
在生成的KMP项目中执行发布任务:
打开生成的KMP项目终端,运行Gradle命令:./gradlew publishToMavenLocal这个任务会把KMP库的所有平台变体(common、JVM、iOS等)发布到本地Maven仓库,Gradle会自动维护各平台的依赖关联。
在KMM库项目中引入依赖:
- 首先在项目根目录的
settings.gradle.kts或模块的build.gradle.kts中添加本地Maven仓库:repositories { mavenLocal() // 其他仓库... } - 然后在模块的
build.gradle.kts中,直接在commonMain添加依赖,Gradle会自动为各个平台匹配对应变体:sourceSets { val commonMain by getting { dependencies { // 其他依赖... implementation("你的生成库groupId:kotlin-client:1.0.0") } } // 其他sourceSet配置保留,无需手动添加各平台的jar依赖 }
- 首先在项目根目录的
方式二:使用复合构建(适合调试阶段)
如果需要频繁修改生成的KMP库,复合构建可以直接关联两个项目,无需每次发布:
在KMM库项目的
settings.gradle.kts中添加复合构建配置:includeBuild("../path/to/你的生成KMP项目目录")注意替换为实际的生成项目路径。
引入依赖:
和方式一的第二步一样,直接在commonMain中添加groupId:artifactId:version格式的依赖即可,Gradle会自动关联本地项目。
不推荐的本地jar方式(仅作参考)
如果必须用本地jar文件,需要手动处理多平台变体,但维护成本高:
- 确保生成的KMP项目编译出iOS的
.framework文件(路径一般在build/bin/ios/iosX64/releaseFramework等目录),将其复制到KMM项目的指定目录(比如iosFrameworks)。 - 在KMM项目的
build.gradle.kts中配置iOS框架依赖:iosX64Main { dependencies { implementation(files("../iosFrameworks/kotlin-client.framework")) } } iosArm64Main { dependencies { implementation(files("../iosFrameworks/kotlin-client.framework")) } } - 同时在commonMain中保留metadata jar依赖,但这种方式容易出现版本不匹配、变体关联错误等问题,不建议长期使用。
内容的提问来源于stack exchange,提问作者rolandl
相关产品推荐
相关产品推荐

