欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring boot 引用外部配置文件的一个坑 spring.config.location

程序员文章站 2022-03-02 12:15:42
...

我们知道spring boot 支持通过配置JVM参数 -Dspring.config.location  为一个外部文件的位置,以达到将配置文件与应用隔离的目的

 

1 在使用中发现一个问题,

如 : 

  • 将spring boot 的配置文件放到一个文件夹 D:/spring-config 下。
  • 配置JVM启动参数 -Dspring.config.location= D:/spring-config

然后会发现项目无法启动。

spring 官网也没有找到对这个配置的更详细的说明

https://docs.spring.io/spring-boot/docs/2.3.1.RELEASE/reference/html/appendix-application-properties.html#common-application-properties

2 先说解决方案:

将配置的路径添加斜杠结尾即可,注意结尾的斜杠

-Dspring.config.location= D:/spring-config/

3 接下来看原因

在这个类里面可以看到spring 关于加载配置文件的各种默认规则,如配置文件的位置 名称等等。

org.springframework.boot.context.config.ConfigFileApplicationListener

也定义了配置文件位置这个属性,至于在哪儿使用就不贴代码了。

	/**
	 * The "config location" property name.
	 */
	public static final String CONFIG_LOCATION_PROPERTY = "spring.config.location";

 

然后看他的load方法。注意到木有  location.endsWith("/"); 也就是必须以 "/" 结尾的配置才会当做目录去遍历其中的文件

		private void load(Profile profile, DocumentFilterFactory filterFactory, DocumentConsumer consumer) {
			getSearchLocations().forEach((location) -> {
				boolean isFolder = location.endsWith("/");
				Set<String> names = isFolder ? getSearchNames() : NO_SEARCH_NAMES;
				names.forEach((name) -> load(location, name, profile, filterFactory, consumer));
			});
		}