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里。
排查验证步骤
- 执行
./gradlew jar,打开build/libs目录下的JAR文件,确认里面存在sql目录及对应的SQL文件。 - 如果JAR中没有资源,检查
sourceSets配置是否正确,确保资源目录被正确识别。 - 如果JAR中有资源但分发版仍报错,替换为流读取方式,避免因类加载器上下文差异导致的资源定位问题。
内容的提问来源于stack exchange,提问作者t3chb0t
相关产品推荐
相关产品推荐

