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),将这两个目录设置为强制加载位置
三、规避方案
根据不同成因,对应解决方式如下:
- 移除强制标记:如果配置文件或启动参数里的路径带了
!,直接去掉即可。修改后Spring Boot会尝试加载该目录下的配置,不存在则自动跳过,不会触发异常。 - 恢复默认配置路径:如果不需要从这两个目录加载配置,直接删除
spring.config.location或spring.config.additional-location对应的配置项,回到Spring Boot默认的配置加载逻辑。 - 自动创建目录(临时方案):如果确实需要从这两个目录加载配置,可在启动脚本中自动创建目录(例如Linux下执行
mkdir -p spring/config),但这属于治标不治本的方式,优先推荐前两种方案。 - 调整自定义配置逻辑:如果存在自定义配置加载代码,检查是否将这两个目录标记为强制,修改为可选加载逻辑。
四、强制配置位置列表的由来
只有当你显式通过!标记某个配置路径为强制时,该路径才会被加入ConfigDataEnvironment.checkMandatoryLocations的校验列表。这个机制的设计目的是确保你声明的「必须存在的配置源」可用,避免应用启动后因配置缺失引发业务异常。默认情况下,所有配置路径都是可选的,不会进入这个强制校验流程。
内容的提问来源于stack exchange,提问作者CryptoFool
相关产品推荐
相关产品推荐

