不灭的焱

革命尚未成功,同志仍须努力 下载Java21

作者:AlbertWen  添加时间:2026-05-31 22:55:21  修改时间:2026-06-04 15:39:50  分类:07.Java框架/系统  编辑

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
  • 启动后通常就能直接访问:
  • classpath:/META-INF/resources/
    • 常用于第三方依赖包自带的静态资源
    • 例如一些 Swagger、Knife4j、WebJar 资源常放这里
  • classpath:/resources/
    • 也是 Spring 支持的静态资源目录之一
    • 用得相对少一些
  • classpath:/static/
    • 最常见
    • 前端静态文件最常放这里
  • classpath:/public/
    • 也是常见默认目录
    • 和 static 类似,只是目录名不同
  • classpath:/.well-known/
    • 这是你额外加的一个目录
    • 常用于放标准验证文件,比如域名校验、移动应用关联文件、证书验证文件等 详细例子

例子 1:访问普通图片

例子 2:访问首页 HTML

例子 3: .well-known 的用途

例子 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 平白多加出来的。