You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 12:44:50