为何Kotlin多平台项目中main函数需置于jvmMain而非commonMain?
问题原因解析:commonMain中放置main函数导致找不到主类的原因
Kotlin多平台源码集的分工逻辑
commonMain是用来存放所有目标平台通用的无平台依赖代码的源码集,它本身不绑定任何具体平台(比如JVM、JS、Native)。编译时,commonMain的代码会被合并到各个目标平台的编译单元,但它不会单独生成可执行的JVM字节码入口。而jvmMain是专门针对JVM平台的源码集,只有这里的代码会被编译成符合JVM规范的可执行类,包含主类入口的元数据。main函数的平台绑定特性
你写的fun main() = application { App() }中的application函数(大概率是JavaFX或Compose Desktop的API)是JVM平台专属的API。这些API在commonMain中没有实际的平台实现——虽然IDE可能通过临时缓存识别到依赖,但实际编译打包时,commonMain的代码不会被标记为JVM的主类入口,自然无法生成可被JVM识别的MainKt类。IDE缓存与实际编译的差异
一开始能正常运行是因为IDE缓存了临时编译状态,没有彻底重新构建所有源码集。重启IDE后,编译流程从头执行,commonMain的代码无法生成有效的JVM主类,就会抛出找不到主类的错误。
内容的提问来源于stack exchange,提问作者Yoloroy
相关产品推荐
相关产品推荐

