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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 13:54:32