如何在IntelliJ中为Kotlin Multiplatform Compose项目生成免JRE单.exe文件?
可以生成无JRE依赖的独立.exe文件,具体操作步骤如下
1. 配置桌面模块的Gradle任务
在KMM项目的desktop模块(桌面端代码所在模块)的build.gradle.kts中,添加基于JDK自带jpackage工具的打包任务,同时通过jlink生成裁剪后的轻量JRE嵌入到exe中:
import org.gradle.jvm.tasks.JLink import org.gradle.jvm.tasks.JPackageTask // 确保JavaExec任务配置正确 tasks.withType<JavaExec> { jvmArgs += "-Djava.awt.headless=false" } // 注册jpackage打包任务 val jpackage by tasks.registering(JPackageTask::class) { // 依赖先生成包含所有依赖的uber jar dependsOn(tasks.named("packageUberJarForCurrentOS")) val uberJar = tasks.named("packageUberJarForCurrentOS").get().outputs.files.singleFile val jdkHome = System.getProperty("java.home") val outputDir = file("${project.buildDir}/standalone-exe") input = file(uberJar.parent) destination = outputDir mainJar = uberJar.name // 替换为你的项目主类全路径(Kotlin主类通常带Kt后缀,比如com.example.MainKt) mainClass = "your.full.package.name.MainKt" // 生成裁剪后的轻量JRE(减小最终exe体积) val jlinkDir = file("${project.buildDir}/jlink-jre") val jlink by tasks.registering(JLink::class) { this.jdkHome = jdkHome outputDir = jlinkDir // 裁剪参数:移除调试信息、文档,启用压缩 options = listOf("--strip-debug", "--no-man-pages", "--no-header-files", "--compress=2") // 按需添加项目依赖的JDK模块,Compose Desktop至少需要java.desktop modules = listOf("java.base", "java.desktop", "java.logging", "java.xml") } runtimeImage = jlinkDir // Windows专属配置:生成单文件exe winOptions { // 带控制台输出设为true,纯GUI应用设为false console = true // 可选:设置exe图标,替换为你的ico文件路径 icon = file("src/main/resources/app-icon.ico") // 启用单文件模式(需JDK17+) addArgs("--type", "exe", "--win-single-file") } }
2. 执行打包任务
在终端中运行对应命令:
- Windows系统:
gradlew.bat jpackage - macOS/Linux系统:
./gradlew jpackage
任务执行完成后,生成的独立exe文件会存放在desktop/build/standalone-exe目录下。
3. 关键注意事项
- 必须使用JDK17及以上版本:
--win-single-file单文件打包特性是JDK17才引入的。 - 主类路径要准确:可通过查看
packageUberJarForCurrentOS任务输出的jar包,确认MANIFEST.MF中的主类名称。 - 按需补充JDK模块:如果打包时出现类找不到的报错,需在
jlink的modules列表中添加对应的JDK模块。 - 测试兼容性:将生成的exe复制到未安装JRE的Windows电脑上,双击验证是否能正常启动。
内容的提问来源于stack exchange,提问作者Kudla
相关产品推荐
相关产品推荐

