Spring Cloud Config在OpenShift中报错:文件扩展名不被PropertySourceLoader识别
问题背景
- 环境:Spring Boot v2.4.5,Maven多模块项目,应用配置文件位于
boot模块 - 应用配置(
application.yml):
spring: application: name: app version: @project.version@ config: import: optional:configserver:${CLOUD_CONFIG_SERVER_URL} cloud: config: uri: ${CLOUD_CONFIG_SERVER_URL} username: ${CLOUD_CONFIG_USERNAME} password: ${CLOUD_CONFIG_PASSWORD} label: ${CLOUD_CONFIG_LABEL:develop}
- 依赖配置:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency>
- 错误现象:本地运行正常,部署到OpenShift后触发错误:
File extension is not known to any PropertySourceLoader. If the location is meant to reference a directory, it must end in '/'
排查方案
检查
CLOUD_CONFIG_SERVER_URL环境变量值
确认OpenShift中该变量是否正确配置:- 无多余空格、换行或格式错误,需是完整的URL(例如
http://config-server:8888) - 对比本地运行时的变量值,排查环境差异导致的URL解析问题
- 无多余空格、换行或格式错误,需是完整的URL(例如
简化配置,避免重复触发加载
Spring Boot 2.4+的spring.config.import与旧版spring.cloud.config配置可能存在冲突,二选一即可:
方案1:保留spring.config.import,移除spring.cloud.config节点,将参数拼接至import路径:spring: application: name: app version: @project.version@ config: import: optional:configserver:${CLOUD_CONFIG_SERVER_URL}?username=${CLOUD_CONFIG_USERNAME}&password=${CLOUD_CONFIG_PASSWORD}&label=${CLOUD_CONFIG_LABEL:develop}方案2:移除
spring.config.import,保留spring.cloud.config节点配置验证配置文件打包路径
在OpenShift中执行jar tf your-app.jar,确认application.yml是否存在于BOOT-INF/classes/目录下,排查打包或部署时的文件路径错误检查Spring Cloud版本兼容性
Spring Boot 2.4.5对应Spring Cloud 2020.0.3(Ilford版本),需确保spring-cloud-starter-config版本与Spring Boot匹配:- 在Maven的
dependencyManagement中引入对应版本的Spring Cloud BOM,避免版本不兼容导致的解析异常
- 在Maven的
排查配置文件格式问题
确认部署到OpenShift后的application.yml无编码错误、特殊字符或换行符格式差异(Windows vs Unix),可通过cat命令查看文件内容,对比本地文件一致性
内容的提问来源于stack exchange,提问作者user3475366

