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

Spring Boot 2.7.1为何要求当前目录存在spring及spring/config目录?

Spring Boot 2.7.1启动依赖spring/spring/config目录问题解析

一、问题核心原因

Spring Boot 2.4版本重构了配置数据加载体系(引入Config Data API),ConfigDataEnvironment.checkMandatoryLocations方法的作用是校验被标记为「强制加载」的配置位置是否存在。你的情况是./spring/和./spring/config/被设为了强制配置位置,一旦目录不存在,就会触发ConfigDataLocationNotFoundException异常。

需要明确的是:Spring Boot 2.7.x的默认配置加载逻辑中,并不会要求这两个目录必须存在。默认的可选配置路径包括classpath:/、classpath:/config/、file:./、file:./config/、file:./config/*/,这些路径不存在时只会跳过加载,不会报错。

二、是否由自身操作导致

是的,这并非Spring Boot的默认行为,大概率是以下操作之一导致:

  • 项目配置文件(application.yml/application.properties)中设置了spring.config.location或spring.config.additional-location,并且给路径加上了!后缀标记为强制(例如spring.config.location=file:./spring/!,file:./spring/config/!)
  • 应用启动命令中添加了--spring.config.location参数,同样带了!强制标记
  • 项目中自定义了配置加载逻辑(比如实现EnvironmentPostProcessor),将这两个目录设置为强制加载位置

三、规避方案

根据不同成因,对应解决方式如下:

  1. 移除强制标记:如果配置文件或启动参数里的路径带了!,直接去掉即可。修改后Spring Boot会尝试加载该目录下的配置,不存在则自动跳过,不会触发异常。
  2. 恢复默认配置路径:如果不需要从这两个目录加载配置,直接删除spring.config.location或spring.config.additional-location对应的配置项,回到Spring Boot默认的配置加载逻辑。
  3. 自动创建目录(临时方案):如果确实需要从这两个目录加载配置,可在启动脚本中自动创建目录(例如Linux下执行mkdir -p spring/config),但这属于治标不治本的方式,优先推荐前两种方案。
  4. 调整自定义配置逻辑:如果存在自定义配置加载代码,检查是否将这两个目录标记为强制,修改为可选加载逻辑。

四、强制配置位置列表的由来

只有当你显式通过!标记某个配置路径为强制时,该路径才会被加入ConfigDataEnvironment.checkMandatoryLocations的校验列表。这个机制的设计目的是确保你声明的「必须存在的配置源」可用,避免应用启动后因配置缺失引发业务异常。默认情况下,所有配置路径都是可选的,不会进入这个强制校验流程。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 11:09:14