Spring Boot 配置文件中,有一段如下代码,有啥作用呢?
spring:
web:
resources:
# 添加静态资源位置
static-locations:
- classpath:/META-INF/resources/
- classpath:/resources/
- classpath:/static/
- classpath:/public/
- classpath:/.well-known/
AI回复
- application.yml:L38-L46 这段 static-locations 是在告诉 Spring Boot: Spring MVC 去哪些目录里查找“静态资源文件”。
- 你这里配置的是:
spring: web: resources: static-locations: - classpath:/META-INF/resources/ - classpath:/resources/ - classpath:/static/ - classpath:/public/ - classpath:/.well-known/
- 这些目录里的文件,通常可以被直接通过 HTTP 访问,不需要你自己写 Controller。 它管什么文件
- 常见静态资源:
- .html
- .js
- .css
- 图片文件,如 .png .jpg .svg
- 下载文件
- 前端打包产物
- 比如你放一个文件:
- src/main/resources/static/logo.png
- 启动后通常就能直接访问:
- http://localhost:30900/logo.png 你这几个路径分别是什么意思
- classpath:/META-INF/resources/
- 常用于第三方依赖包自带的静态资源
- 例如一些 Swagger、Knife4j、WebJar 资源常放这里
- classpath:/resources/
- 也是 Spring 支持的静态资源目录之一
- 用得相对少一些
- classpath:/static/
- 最常见
- 前端静态文件最常放这里
- classpath:/public/
- 也是常见默认目录
- 和 static 类似,只是目录名不同
- classpath:/.well-known/
- 这是你额外加的一个目录
- 常用于放标准验证文件,比如域名校验、移动应用关联文件、证书验证文件等 详细例子
例子 1:访问普通图片
- 假设文件放在:
- src/main/resources/static/img/avatar.png
- 运行后访问:
- 因为 Spring 会去 classpath:/static/ 下找 img/avatar.png
例子 2:访问首页 HTML
- 假设文件放在:
- src/main/resources/public/index.html
- 运行后访问:
- 如果项目没有别的首页映射,有时直接访问根路径也可能命中它:
例子 3: .well-known 的用途
- 假设你放一个文件:
- src/main/resources/.well-known/assetlinks.json
- 启动后访问:
- 这个很常见于:
- Android App Links
- Apple Universal Links
- 某些平台域名归属校验
例子 4:Knife4j / Web 依赖资源
- 某些依赖 jar 包里会把前端资源放到:
- META-INF/resources/
- 你配置了这个目录后,这些资源也能被 Spring 当成静态资源暴露出来
- 所以很多文档页面、前端 UI 依赖资源能直接访问到 为什么要配这个
- Spring Boot 本身就有默认静态目录规则。
- 你这里显式配置的好处是:
- 明确告诉项目从哪些目录加载静态资源
- 新增了 /.well-known/ 这种默认不一定会重点考虑的目录
- 避免以后别人改配置时搞不清资源从哪里出来 如果不配会怎样
- Spring Boot 默认也会扫描一些常见目录,比如:
- /META-INF/resources/
- /resources/
- /static/
- /public/
- 所以前四项很多时候“不配也能用”
- 但你这里写出来的意义在于:
- 显式化
- 可维护
- 额外补上 /.well-known/ 它不负责什么
- 它不负责接口路由
- /api/user/list 这种还是 Controller 处理
- 它不负责模板渲染
- Thymeleaf/JSP 那类属于模板系统
- 它也不等于文件上传目录
- 上传到磁盘的文件,如果不在这些静态目录内,也不会自动对外访问 一个容易混淆的点
- 这里是 classpath: ,表示“打包进应用后的类路径资源”
- 不是你电脑任意目录
- 比如这不是:
- /Users/albertwen/uploads
- 如果你想暴露本地磁盘目录,通常要额外做 ResourceHandler 配置,而不是只写这个 结合你这个项目理解
- 当前配置在 application.yml:L38-L46
- 它的实际作用就是:
- 让 Spring 从 META-INF/resources 、 resources 、 static 、 public 、 .well-known 这几个类路径目录里找静态文件并直接提供 HTTP 访问 一句话总结
- static-locations 就是“静态资源搜索路径列表”,决定浏览器请求某个文件时,Spring 去哪些目录里找它。 如果你愿意,我可以继续结合你这个项目,给你画一个“请求 URL -> 匹配静态目录 -> 返回文件”的具体流程图式说明。
.well-known 访问,为什么多了一个 访问子路径 .well-known ?
- 因为你配置的不是“把文件内容摊平到根路径”,而是把 classpath:/.well-known/ 这个目录本身作为一个静态资源根目录。
- Spring 访问静态资源时,会保留资源的相对路径结构,所以目录名 .well-known 会出现在 URL 里。
怎么理解
- 你现在的配置在 application.yml:
spring: web: resources: static-locations: - classpath:/.well-known/ - 如果文件实际放在:
- src/main/resources/.well-known/assetlinks.json
- 那它对应的访问路径就是:
- /.well-known/assetlinks.json
为什么不是直接 /assetlinks.json
- 因为 Spring 是按“资源在类路径里的相对位置”来找的。
- 这个文件的相对位置就是:
- .well-known/assetlinks.json
- 所以 URL 里自然也带 .well-known
举个对比
- classpath:/static/ 下的:
- src/main/resources/static/js/app.js
- 访问:
- /js/app.js
- classpath:/.well-known/ 下的:
- src/main/resources/.well-known/assetlinks.json
- 访问:
- /.well-known/assetlinks.json
- 本质一样:都是“目录下的相对路径原样暴露”。
为什么偏偏要叫 .well-known
- .well-known 不是你项目随便起的名字,它本身是一个通用标准路径前缀。
- 很多协议、平台校验都要求文件必须放在这个固定 URL 下,比如:
- /.well-known/assetlinks.json
- /.well-known/apple-app-site-association
- /.well-known/security.txt
- 也就是说,不是“多出来一个子路径”,而是这些规范本来就要求这个子路径必须存在。
如果你想直接 /assetlinks.json 访问
- 那文件就不能放在 /.well-known/ 这个规范目录语义下。
- 你要么:
- 放到别的静态目录根下
- 要么:
- 自己写 ResourceHandler / Controller 单独映射
一句话
- .well-known 出现在访问路径里,是因为它既是你配置的静态资源目录名,也是很多标准协议要求的固定 URL 前缀,不是 Spring 平白多加出来的。