在使用Kotlin Compose Desktop开发PC端小工具的过程中,我遇到了一个让人有些困惑的问题。当我完成开发后,发现这个小工具只能在IDEA中正常运行,一旦打包成EXE文件,点击后却毫无反应,而且也没有任何报错信息,这给排查问题带来了一定难度。
经过一番排查,我发现问题出在mainClass
的配置上。在项目最外层的build.gradle.kts
文件中,有这样一段代码:
compose.desktop {
application {
mainClass = "MainKt" <----就是它
nativeDistributions {
targetFormats(TargetFormat.Dmg, TargetFormat.Exe, TargetFormat.Deb)
packageName = "ApkManager"
packageVersion = "1.0.0"
}
}
}
这里的mainClass
代表的是主程序文件的名字,后面的Kt
是Kotlin文件的一种常见后缀(没错,它就是后缀)。在项目初始创建时,默认会在kotlin
目录下生成一个Main.kt
文件,所以这里默认的配置就是mainClass = "MainKt"
。这种命名规则其实就是去掉文件名的后缀点,然后采用驼峰命名法。
但是,后来我对Main.kt
文件进行了修改,给它添加了包名。没想到,这样一来,在运行打包后的程序时,就出现了找不到文件的情况,更离谱的是居然还不报错,这就导致问题很难被发现。
好在解决这个问题的方法并不复杂,只需要在mainClass
的配置中,在文件名前面加上包名就可以了。比如修改后的配置如下:
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
,那么mainClass
的配置应该是这样:
compose.desktop {
application {
mainClass = "Main_desktopKt"
}
}
这里还有个需要注意的点,虽然配置参数的名字是mainClass
,但实际上,对于目标文件而言,如果它不是传统意义上的Class
文件,即便把main
函数直接写在外面也是可行的。不过,main
函数是必不可少的,它是程序运行的入口。
如果大家觉得这个配置过程有些麻烦,为了避免出现类似的问题,我建议尽量不要去改动这个主入口文件。保持它新建时的样子,然后把具体的业务逻辑全部写在另一个类里,通过引用的方式来实现功能就好。这样能有效避免因为配置问题导致的程序异常。