【KMP】解决桌面端打包异常无法运行

最近用kotlin compose desktop搓了个PC端小工具,发现个怪事,必须用IDEA才能运行,打包成EXE就点不开,一点反应都没有,也没有报错。

最后发现是因为mainClass的配置有问题导致的。

在最外层的build.gradle.kts里有这么一段:

ini 复制代码
compose.desktop {
    application {
        mainClass = "MainKt"  <----就是它

        nativeDistributions {
            targetFormats(TargetFormat.Dmg, TargetFormat.Exe, TargetFormat.Deb)
            packageName = "ApkManager"
            packageVersion = "1.0.0"
        }
    }
}

这里的mainClass是主程序文件的名字,后面那个Kt是后缀(对没错那是后缀)

在项目一开始创建的时候,默认在kotlin目录下生成了一个Main.kt文件,所以这里默认就写了mainClass = "MainKt",其实就是去掉后缀名的点,然后用驼峰命名。

后来我改过这个Main.kt文件,给它加了包名,于是运行的时候就找不到了,离谱的是找不到竟然不报错。

解决办法非常简单,在前面加上包名就可以了。

ini 复制代码
compose.desktop {
    application {
        mainClass = "com.dubhe.apkmamanger.MainKt"

        nativeDistributions {
            targetFormats(TargetFormat.Dmg, TargetFormat.Exe, TargetFormat.Deb)
            packageName = "ApkManager"
            packageVersion = "1.0.0"
        }
    }
}

如果文件名有多个隔断,前面的用下划线替代,最后的直接去掉。像这样:

原文件名:main.desktop.kt

ini 复制代码
compose.desktop {
    application {
        mainClass = "Main_desktopKt"
    }
}

虽然这个参数的名字叫mainClass,但实际上那个目标文件如果不是Class,直接把main函数扔外面也是可以的。但是main函数是一定要有的。

如果觉得很麻烦建议直接不要动这个主入口文件,new出来长啥样就啥样,逻辑全写另一个类里引用它就好。免得抽风。

相关推荐
JMchen1231 天前
Android后台服务与网络保活:WorkManager的实战应用
android·java·网络·kotlin·php·android-studio
儿歌八万首1 天前
硬核春节:用 Compose 打造“赛博鞭炮”
android·kotlin·compose·春节
消失的旧时光-19431 天前
从 Kotlin 到 Dart:为什么 sealed 是处理「多种返回结果」的最佳方式?
android·开发语言·flutter·架构·kotlin·sealed
有位神秘人1 天前
kotlin与Java中的单例模式总结
java·单例模式·kotlin
Jinkxs1 天前
Gradle - 与Groovy/Kotlin DSL对比 构建脚本语言选择指南
android·开发语言·kotlin
&有梦想的咸鱼&1 天前
Kotlin委托机制的底层实现深度解析(74)
android·开发语言·kotlin
golang学习记1 天前
IntelliJ IDEA 2025.3 重磅发布:K2 模式全面接管 Kotlin —— 告别 K1,性能飙升 40%!
java·kotlin·intellij-idea
gjxDaniel3 天前
Kotlin编程语言入门与常见问题
android·开发语言·kotlin
野生技术架构师3 天前
Java 21虚拟线程 vs Kotlin协程:高并发编程模型的终极对决与选型思考
java·开发语言·kotlin
言之。3 天前
Kotlin快速入门
android·开发语言·kotlin