如何在Compose for Desktop安装程序中额外打包updater.jar至安装根目录
如何在Compose for Desktop安装程序中额外打包updater.jar至安装根目录
我之前做Compose Desktop自动更新功能时,也碰到过一模一样的问题——资源里的updater.jar死活出现在安装目录里,折腾了好一阵才摸清楚正确的配置方式,给你一步步说清楚:
为什么你之前的配置失败?
你直接在nativeDistributions块下写files.from()是找错了层级,nativeDistributions本身并没有files这个属性,它是contents子块下的方法,这就是你拿到“Unresolved reference 'files'”错误的核心原因。
正确的Gradle配置方法
你需要把额外文件的打包逻辑放到nativeDistributions下的contents块里,这样Gradle才会把updater.jar打包到安装根目录(和.exe同级)。修改你的composeApp/build.gradle.kts如下:
compose.desktop { application { mainClass = "de.dev.project.MainKt" nativeDistributions { packageName = "project" // 保留你原来的其他配置(比如version、vendor等) contents { // 从资源目录引入updater.jar from("src/desktopMain/resources/updater.jar") { // 指定放到安装根目录("." 代表根路径) into(".") } } } } }
配置完之后,重新运行./gradlew :composeApp:packageMsi打包,安装后你就能在安装目录里看到updater.jar了。
额外提示:别用user.dir获取安装目录
你当前获取updater.jar的代码用了System.getProperty("user.dir"),这个路径其实是当前工作目录,不是应用的安装目录(比如用户从开始菜单启动应用时,user.dir可能是用户的文档目录),很容易出现找不到文件的情况。
推荐用更可靠的方式获取应用安装目录:
// 通过主类的代码源位置获取安装根目录 val appCodeSource = MainKt::class.java.protectionDomain.codeSource val appDir = File(appCodeSource.location.toURI()).parentFile val updaterJar = File(appDir, "updater.jar") if (!updaterJar.exists()) { // 错误处理逻辑 }
这样不管用户从哪里启动应用,都能准确找到updater.jar的位置。
内容来源于stack exchange
相关产品推荐
相关产品推荐

