Kotlin Compose Desktop打包MSI后运行exe提示“Failed to launch JVM”求助
Kotlin Compose Desktop MSI安装包运行提示"Failed to launch JVM"的解决办法
针对你遇到的问题,以下是几个可尝试的解决方案:
补充必要JVM模块并确保配置生效
虽然你已添加modules("java.sql"),但H2数据库可能还依赖其他JDK模块(比如java.naming用于JNDI、java.desktop用于部分系统交互)。建议在全局nativeDistributions和Windows专属配置中都明确添加这些模块,避免打包时遗漏:nativeDistributions { // ...其他配置 modules("java.sql", "java.naming", "java.desktop") windows { // ...其他配置 modules("java.sql", "java.naming", "java.desktop") } }关闭JRE最小化裁剪
Compose Desktop默认打包最小化JRE,可能意外移除H2所需依赖。在release构建类型中禁用JRE最小化:buildTypes.release { jre { isMinimal.set(false) // 可选:指定JRE版本和厂商,提升兼容性 jreVersion = "17" jreVendor = "adoptium" } }查看日志定位具体错误
- 执行打包时查看详细日志:
./gradlew packageMsi --info,搜索是否有模块缺失或依赖打包失败的警告。 - 安装MSI后,到程序安装目录(默认
C:\Program Files\RepeaterNow)查找日志文件,查看JVM启动失败的具体原因(比如找不到某个类或模块)。
- 执行打包时查看详细日志:
清理缓存后重新打包
执行./gradlew clean packageMsi清理旧构建产物,避免缓存导致的配置不生效问题。修正资源文件路径
脚本中资源路径用了反斜杠\,建议换成跨平台的正斜杠/,避免Windows打包时路径解析异常:windows { iconFile.set(project.file("src/main/resources/icon.ico")) }
整合以上建议后的完整Gradle脚本示例:
import org.jetbrains.compose.desktop.application.dsl.TargetFormat import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { kotlin("jvm") version "1.9.21" id("org.jetbrains.compose") version "1.5.11" } group = "org.makariyp" version = "1.0" repositories { google() mavenCentral() maven("https://maven.pkg.jetbrains.space/public/p/compose/dev") } dependencies { testImplementation("org.jetbrains.kotlin:kotlin-test:1.8.10") implementation(compose.desktop.currentOs) implementation("com.h2database:h2:2.2.224") } tasks.test { useJUnitPlatform() } tasks.withType<KotlinCompile>() { kotlinOptions.jvmTarget = "17" kotlinOptions.freeCompilerArgs += "-opt-in=kotlin.RequiresOptIn" } compose.desktop { application { mainClass = "org.makariyp.MainKt" nativeDistributions { targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Deb) packageName = "RepeaterNow" packageVersion = "1.0.0" modules("java.sql", "java.naming", "java.desktop") buildTypes.release { jre { isMinimal.set(false) jreVersion = "17" jreVendor = "adoptium" } proguard { isEnabled.set(false) } } macOS { iconFile.set(project.file("src/main/resources/icon.icns")) } windows { iconFile.set(project.file("src/main/resources/icon.ico")) modules("java.sql", "java.naming", "java.desktop") } linux { iconFile.set(project.file("src/main/resources/icon.png")) } } } }
内容的提问来源于stack exchange,提问作者Petrov Makariy
相关产品推荐
相关产品推荐

