解决Kotlin Compose Desktop桌面端打包后无法运行的问题

开发工具 潘老师 1周前 (04-16) 14 ℃ (0) 扫码查看

在使用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函数是必不可少的,它是程序运行的入口。

如果大家觉得这个配置过程有些麻烦,为了避免出现类似的问题,我建议尽量不要去改动这个主入口文件。保持它新建时的样子,然后把具体的业务逻辑全部写在另一个类里,通过引用的方式来实现功能就好。这样能有效避免因为配置问题导致的程序异常。


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/tool/17397.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】