如何将Kotlin桌面应用编译为含依赖与JRE的单EXE文件?
将Kotlin Compose桌面应用打包为单文件可移植EXE
可以实现,通过调整Gradle配置结合jpackage特性,就能生成包含所有依赖和Java运行时的单个EXE文件,无需MSI安装程序。以下是具体配置修改步骤:
1. 启用代码缩减(可选但推荐)
开启ProGuard减小最终打包体积,修改build.gradle.kt中ProGuard相关配置:
buildTypes.release.proguard { isEnabled = true configurationFiles.from(file("proguard-compose.pro")) }
在项目根目录创建proguard-compose.pro文件,添加基础混淆规则:
-keep class MainKt { public static void main(java.lang.String[]); } -keep class androidx.compose.** { *; } -keep class kotlin.** { *; } -dontwarn androidx.compose.**
2. 修改nativeDistributions配置生成单文件
更新nativeDistributions块,添加jpackage的--win-onefile参数(需JDK 17+支持),同时可按需缩减JRE模块:
compose.desktop { application { mainClass = "MainKt" javaHome = System.getenv("JDK_17") jvmArgs += listOf("-Xmx2G") nativeDistributions { targetFormats(TargetFormat.Exe) packageVersion = "1.2.3" packageName = "MyApp-v$packageVersion" includeAllModules = true // 包含Java运行时 // 只保留应用必需的JRE模块,减小体积 modules = listOf( "java.base", "java.desktop", "java.logging", "java.naming" ) windows { perUserInstall = true // 添加jpackage参数生成单文件EXE jpackageExtraArgs += listOf("--win-onefile") } } buildTypes.release.proguard { isEnabled = true configurationFiles.from(file("proguard-compose.pro")) } } }
3. 执行打包任务
运行以下Gradle命令完成打包:
./gradlew packageReleaseNativeDistribution
打包完成后,单个EXE文件会生成在build/compose/binaries/native/release/exe目录下,该文件可直接运行,无需安装,完全便携。
关键注意事项
--win-onefile是JDK 17及以上版本jpackage的特性,确保你的javaHome指向的JDK版本支持该参数- 混淆规则需根据应用实际依赖调整,避免运行时出现类找不到或方法无法调用的问题
- 单文件EXE首次启动时会自动解压到系统临时目录,启动速度略慢于文件夹式分发,但便携性更优
内容的提问来源于stack exchange,提问作者t3chb0t
相关产品推荐
相关产品推荐

