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

我们知道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 names = isFolder ? getSearchNames() : NO_SEARCH_NAMES;
				names.forEach((name) -> load(location, name, profile, filterFactory, consumer));
			});
		}

补充一下:

-Dspring.config.location 的值可以为文件或者路径,一般情况下我们的应用会有多个配置文件,所以应该是文件夹的形式居多。

但是springboot 志在微服务,估计spring 是认为单个配置文件足以应付大多数场景,所以做了这个判断。

 

这个变量的值时具体的文件还是一个文件夹,是可以通过java的File的Api接口去判定的,而不是通过反斜杠去判断。这样可能对开发更友好一点吧。

你可能感兴趣的:(spring,boot)