Kotlin Multiplatform变体选择问题:JVM消费项目无法正确拉取RoboVM变体依赖
Kotlin Multiplatform变体选择问题:JVM消费项目无法正确拉取RoboVM变体依赖
你遇到的问题核心其实是Gradle变体匹配的双向性——你只在KMP项目端给RoboVM目标配置了自定义属性,但消费端(:jvm-consumer)没有明确告诉Gradle它要选这个属性的变体,所以Gradle默认匹配了第一个符合JVM平台的Desktop变体。
下面是具体的解决步骤:
1. 理解变体匹配逻辑
Gradle的变体选择是双向匹配的过程:
- 依赖端(你的KMP项目)提供带有属性标记的变体(比如RoboVM变体带有
testPlatformAttribute="robovm"等标识) - 消费端(
:jvm-consumer)必须在自己的配置中声明期望的属性,Gradle才会从依赖端筛选出对应的变体
你之前运行./gradlew :shared:dependencies --configuration robovmRuntimeClasspath能看到正确结果,是因为这个配置本身就带有RoboVM的属性标记,但:jvm-consumer的runtimeClasspath配置没有这些标记,所以Gradle自动选了默认的Desktop变体。
2. 在消费端声明属性需求
在:jvm-consumer的build.gradle.kts中,给需要拉取RoboVM变体的配置(compileClasspath和runtimeClasspath)添加属性声明,有两种配置方式可选:
方式一:全局配置(所有KMP依赖都用RoboVM变体)
适合所有KMP依赖都需要RoboVM变体的场景:
// 先定义需要用到的属性(如果没有从自定义插件引入的话) val testPlatformAttribute = Attribute.of("test_platform", String::class.java) val kmmTargetNameAttribute = Attribute.of("org.jetbrains.kotlin.target.name", String::class.java) val targetJvmEnvironmentAttribute = Attribute.of("org.gradle.jvm.environment", String::class.java) val kotlinPlatformTypeAttribute = Attribute.of("org.jetbrains.kotlin.platform.type", String::class.java) configurations { // 给编译类路径配置属性 compileClasspath { attributes { attribute(testPlatformAttribute, "robovm") attribute(kmmTargetNameAttribute, "robovm") attribute(targetJvmEnvironmentAttribute, "robovm") attribute(kotlinPlatformTypeAttribute, "jvm") } } // 给运行时类路径配置属性 runtimeClasspath { attributes { attribute(testPlatformAttribute, "robovm") attribute(kmmTargetNameAttribute, "robovm") attribute(targetJvmEnvironmentAttribute, "robovm") attribute(kotlinPlatformTypeAttribute, "jvm") } } } // 正常声明依赖即可 dependencies { implementation(project(":shared")) implementation(project(":models")) implementation(project(":databases")) }
方式二:单个依赖配置(仅特定依赖用RoboVM变体)
适合部分依赖需要RoboVM变体的场景:
// 先定义需要用到的属性 val testPlatformAttribute = Attribute.of("test_platform", String::class.java) val kmmTargetNameAttribute = Attribute.of("org.jetbrains.kotlin.target.name", String::class.java) val targetJvmEnvironmentAttribute = Attribute.of("org.gradle.jvm.environment", String::class.java) val kotlinPlatformTypeAttribute = Attribute.of("org.jetbrains.kotlin.platform.type", String::class.java) dependencies { implementation(project(":shared")) { attributes { attribute(testPlatformAttribute, "robovm") attribute(kmmTargetNameAttribute, "robovm") attribute(targetJvmEnvironmentAttribute, "robovm") attribute(kotlinPlatformTypeAttribute, "jvm") } } // 其他需要RoboVM变体的依赖同理配置 }
3. 验证配置结果
完成配置后,运行以下命令验证依赖树:
./gradlew :jvm-consumer:dependencies --configuration runtimeClasspath
此时你应该能看到:shared、:models等依赖都拉取了RoboVM变体的依赖。
关于自定义能力的补充说明
你之前尝试的自定义能力(Capabilities)通常用于解决依赖冲突(比如同一库的不同变体),但它的生效前提依然是消费端要声明对该能力的需求。你之前可能只在KMP端配置了能力,但消费端没有关联对应的属性或能力需求,所以Gradle依然无法匹配到正确的变体。
内容来源于stack exchange
相关产品推荐
相关产品推荐

