KMP库导入示例项目异常:commonMain无法调用库类
KMP库commonMain依赖无法识别类的问题解决
问题原因
你手动复制的myLib-metadata.jar并非KMP跨平台依赖所需的标准common构件。当使用implementation(project(":myLib"))模块依赖时,Gradle会自动处理KMP模块间的完整依赖上下文(包括common层元数据、各平台构件关联规则),但直接用files导入单个jar文件时,Gradle无法识别这是KMP库的common元数据,因此只能识别命名空间,无法解析具体类。
解决方案
方案一:通过Maven发布导入(推荐)
这是KMP库分发的标准方式,能确保Gradle正确识别跨平台依赖:
- 在myLib的build.gradle中添加发布配置
添加maven发布插件和相关配置,生成完整的KMP构件包:plugins { alias(libs.plugins.kotlinMultiplatform) alias(libs.plugins.android.library) id 'maven-publish' // 新增maven发布插件 } val sdkVersion = "1.2.0" // ... 保留原有的kotlin、android配置 ... publishing { publications { maven(MavenPublication) { from components.kotlinMultiplatform // 关联KMP构件 groupId = "com.yourcompany" // 替换为你的groupId artifactId = "myLib" version = sdkVersion } } repositories { mavenLocal() // 发布到本地Maven仓库 } } - 发布库到本地Maven
执行命令:./gradlew publishToMavenLocal - 在app模块中导入依赖
先添加本地Maven仓库,再直接引用完整的KMP库依赖:repositories { mavenLocal() // 新增本地Maven仓库 // 保留原有的其他仓库(如mavenCentral等) } kotlin { // ... 保留原有的androidTarget、js配置 ... sourceSets { commonMain.dependencies { implementation("com.yourcompany:myLib:$sdkVersion") // 替换为你的groupId和版本 } // androidMain和jsMain的依赖无需手动添加,Gradle会自动关联对应的平台构件 } }
方案二:手动导入时指定构件属性(临时测试用)
如果不想发布到Maven,可通过指定构件属性让Gradle识别common元数据,但这种方式易出错,不推荐用于正式环境:
修改app模块commonMain的依赖配置:
commonMain.dependencies { implementation(files("../libs/myLib-metadata.jar")) { attributes { attribute( org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType.attribute, org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType.common ) } } }
内容的提问来源于stack exchange,提问作者clemence roumy
相关产品推荐
相关产品推荐

