Gradle Java插件默认资源目录为src/main/resources,若自定义目录(如config/)需通过sourceSets.main.resources.srcDirs显式声明,否则不生效;且processResources过滤和IDE识别也需同步配置。

resources目录默认在哪,为什么有时不生效
Gradle Java插件默认把 src/main/resources 当作主资源目录,编译时会原样复制到 build/classes/java/main/ 下(或 build/resources/main/),供类路径加载。但如果你手动创建了其他目录(比如 config/ 或 assets/),不显式声明就不会被识别——不是 Gradle “漏了”,而是它严格按约定或显式配置来处理。
用 sourceSets 自定义资源目录的两种写法
在 build.gradle 里改 sourceSets.main.resources.srcDirs 即可扩展或替换默认路径:
- 追加一个目录(保留默认
src/main/resources):sourceSets.main.resources.srcDirs += 'src/main/config'
- 完全替换(只认你指定的路径):
sourceSets.main.resources.srcDirs = ['src/main/config', 'src/main/assets']
- 注意:路径是相对于项目根目录的字符串,不能用
file()或绝对路径;多个路径用数组,单个也得写成数组形式
测试资源目录也要单独配
测试代码(src/test/java)默认读取 src/test/resources,但如果你有测试专用配置(如 test-config/),同样要配 sourceSets.test.resources.srcDirs:
- 常见错误:把测试用的
application-test.yml放进src/main/resources,结果测试运行时加载的是 main 的配置 - 正确做法:
sourceSets.test.resources.srcDirs += 'src/test/config'
- 验证方式:运行
gradle classes后检查build/resources/test/是否包含该目录下的文件
resources 目录里的文件不会编译,但要注意过滤和占位符
Gradle 默认把 resources 目录下的内容原样复制,但如果你启用了 processResources 任务的过滤(比如替换 ${version}),就得小心路径匹配范围:
- 过滤只作用于
srcDirs中声明的目录,新增的目录必须也在过滤配置里显式 include - 例如启用属性替换:
processResources { filesMatching('**/*.properties') { expand(project.properties) } }这个filesMatching默认只扫src/main/resources,新加的config/要写成filesMatching(['**/*.properties', 'config/**/*.properties']) - IDE(如 IDEA)可能不会自动识别你新增的资源目录,需手动右键 → “Mark as Resources Root”
实际项目里最容易被忽略的是:自定义资源目录后,processResources 任务默认不处理它们,也不触发 IDE 的自动识别——这两点不补上,资源就等于“存在但不可见”。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











