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

Gradle默认处理resources文件夹逻辑及Compose Desktop资源部署问题

Compose Desktop资源读取问题解决方案

核心问题原因

开发环境中,src/main/resources是文件系统中的实际目录,getResource可直接通过文件路径访问资源;但打包为分发版(如Windows EXE)后,资源会被嵌入到JAR文件中,此时依赖文件系统路径的读取方式可能因类加载器上下文变化失效。

需要添加的Gradle配置

确保资源被正确包含到编译产物和分发包中,可在build.gradle.kts中显式配置资源规则:

sourceSets {
    main {
        resources {
            include("sql/**") // 强制包含sql目录下所有文件
        }
    }
}

修正资源读取代码

推荐使用getResourceAsStream替代直接getResource().readText(),JAR中的资源无法通过文件路径直接访问,流读取方式更可靠:

val query = MainConfig::class.java.getResourceAsStream("/sql/create_schema.sql")?.use { inputStream ->
    inputStream.bufferedReader().readText()
} ?: error("无法找到资源文件: /sql/create_schema.sql")

(use块可自动关闭流,避免资源泄漏)

资源存放位置说明

  • 编译阶段:src/main/resources下的文件会被复制到build/resources/main目录,最终嵌入到项目的主JAR文件中,路径为JAR根目录下的sql/xxx.sql。
  • 分发包中:Windows EXE解压后,主JAR文件位于project-1.0.1/lib目录下,通常命名为project.jar或project-1.0.1.jar,资源就包含在这个JAR里。

排查验证步骤

  1. 执行./gradlew jar,打开build/libs目录下的JAR文件,确认里面存在sql目录及对应的SQL文件。
  2. 如果JAR中没有资源,检查sourceSets配置是否正确,确保资源目录被正确识别。
  3. 如果JAR中有资源但分发版仍报错,替换为流读取方式,避免因类加载器上下文差异导致的资源定位问题。

内容的提问来源于stack exchange,提问作者t3chb0t

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 16:00:57