Compose Multiplatform开发MacOS应用:网络检测与平台适配问题
解决Compose Multiplatform中MacOS平台优先加载JVM实现的问题
问题根源
当前项目同时配置了jvm和macosArm64编译目标,且入口函数放在jvmMain中,导致运行MacOS应用时,系统默认加载JVM平台的actual实现,而非MacOS专属版本。
可行解决方案
方案1:移除不必要的JVM目标
如果开发仅针对MacOS平台,直接在build.gradle.kts中删除jvm相关配置,无需再维护jvmMain中的actual实现:
kotlin { macosArm64("macOS") sourceSets { val commonMain by getting { dependencies { implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4") } } val macOSMain by getting { dependsOn(commonMain) dependencies { implementation(compose.desktop.currentOs) } } } }
同时将入口函数移到macOSMain目录下:
fun main() = application { println("test: ${Test().test()}") Window(onCloseRequest = ::exitApplication) { App() } }
方案2:拆分平台入口函数
若需保留JVM目标(用于Windows/Linux桌面开发),为MacOS单独创建入口:
- 在
macOSMain下添加专属入口代码(如上) - 保留
jvmMain中的入口,仅用于JVM平台构建 - 运行MacOS应用时,选择IDEA右上角对应的
macosArm64运行配置,而非JVM配置
方案3:通过注解隔离JVM实现
如果必须保留JVM目标且不能拆分入口,可使用@JvmName注解避免类名冲突:
修改jvmMain中的代码:
@file:JvmName("TestJvm") actual class Test { actual fun test(): String { return "JVM" } }
这样MacOS平台构建时会优先加载macOSMain中的Test类,不会与JVM版本冲突。
验证步骤
运行MacOS应用前,确认:
- 选择的运行配置是
macosArm64目标 - 执行命令行构建时使用
./gradlew runDebugExecutableMacos(根据构建类型调整)
内容的提问来源于stack exchange,提问作者Kevin van Mierlo
相关产品推荐
相关产品推荐

