Spring Boot和多个外部配置文件 [英] Spring Boot and multiple external configuration files

查看:228
本文介绍了Spring Boot和多个外部配置文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有多个属性文件,我想从classpath加载。 / src / main / resources 下有一个默认设置,它是 myapp.jar 的一部分。我的 springcontext 期望文件位于类路径中。 ie

I have multiple property files that I want to load from classpath. There is one default set under /src/main/resources which is part of myapp.jar. My springcontext expects files to be on the classpath. i.e.

<util:properties id="Job1Props"
    location="classpath:job1.properties"></util:properties>

<util:properties id="Job2Props"
    location="classpath:job2.properties"></util:properties>

我还需要使用外部集覆盖这些属性的选项。我在 cwd 中有一个外部配置文件夹。根据spring boot doc配置文件夹应该在classpath上。但是从文档中不清楚它是否只会覆盖 applicaiton.properties 或者配置中的所有属性。

I also need the option to override these properties with an external set. I have an external config folder in cwd. As per spring boot doc config folder should be on classpath. But its not clear from doc if it will only override the applicaiton.properties from there or all the properties in config.

当我测试它时,只有 application.properties 被拾取,其余的属性仍然从 / SRC /主/资源。我已经尝试将它们作为逗号分隔列表提供给 spring.config.location ,但默认设置仍未被覆盖。

When I tested it, only application.properties gets picked up and rest of properties are still picked up from /src/main/resources. I have tried supplying them as comma separated list to spring.config.location but the default set is still not being overriden.

如何使多个外部配置文件覆盖默认配置文件?

How do I make mulitiple external config files override default ones?

作为解决方法,我目前使用 app.config.location (app特定属性),我通过命令行提供。 ie

As workaround I currently used app.config.location (app specific property) which I supply through the command line. i.e

java -jar myapp.jar app.config.location=file:./config

我将 applicationcontext 更改为

<util:properties id="Job2Props"
    location="{app.config.location}/job2.properties"></util:properties>

这是我在加载Application时在文件和类路径之间进行分离的方法。

编辑:

And this is how I make separation between file and classpath while loading Application.
EDITS:

//psuedo code

if (StringUtils.isBlank(app.config.location)) {
            System.setProperty(APP_CONFIG_LOCATION, "classpath:");
}

我真的不想使用上面的解决方法并且弹簧覆盖所有外部在类路径上配置文件,就像它对 application.properties 文件一样。

I would really like not to use the above workaround and have spring override all external config files on the classpath like it does for the application.properties file.

推荐答案

使用Spring Boot时,属性按以下顺序加载(参见外化配置

When using Spring Boot the properties are loaded in the following order (see Externalized Configuration in the Spring Boot reference guide).


  1. 命令行参数。

  2. Java系统属性(System.getProperties())。

  3. 操作系统环境变量。

  4. 来自java的JNDI属性:comp / env

  5. 只有随机属性的RandomValuePropertySource。*。

  6. 打包jar之外的应用程序属性(application.properties包括YAML和配置文件变体) )。

  7. 在j中打包的应用程序属性ar(application.properties包括YAML和配置文件变体)。

  8. @Configuration类上的@PropertySource注释。

  9. 默认属性(使用SpringApplication指定)。 setDefaultProperties)。

  1. Command line arguments.
  2. Java System properties (System.getProperties()).
  3. OS environment variables.
  4. JNDI attributes from java:comp/env
  5. A RandomValuePropertySource that only has properties in random.*.
  6. Application properties outside of your packaged jar (application.properties including YAML and profile variants).
  7. Application properties packaged inside your jar (application.properties including YAML and profile variants).
  8. @PropertySource annotations on your @Configuration classes.
  9. Default properties (specified using SpringApplication.setDefaultProperties).

解析属性时(即 @Value($ {myprop})以相反的顺序完成解析(从9开始)。

When resolving properties (i.e. @Value("${myprop}") resolving is done in the reverse order (so starting with 9).

要添加不同的文件,您可以使用 spring.config.location 属性,该属性采用逗号分隔的属性文件列表或文件位置(目录)。

To add different files you can use the spring.config.location properties which takes a comma separated list of property files or file location (directories).

-Dspring.config.location=your/config/dir/

上面的一个将添加一个目录,该目录将参考 application.properties 文件。

The one above will add a directory which will be consulted for application.properties files.

-Dspring.config.location=classpath:job1.properties,classpath:job2.properties

这会将2个属性文件添加到已加载的文件中。

This will add the 2 properties file to the files that are loaded.

默认配置文件和位置在附加指定的 spring.config.location 之前加载,意味着后者将始终覆盖先前设置的属性。 (另见 Spring Boot Reference Guide的本节

The default configuration files and locations are loaded before the additonally specified spring.config.location ones meaning that the latter will always override properties set in the earlier ones. (See also this section of the Spring Boot Reference Guide).


如果 spring。 config.location 包含它们应该以/结尾的目录(而不是文件)(并且将附加从 spring.config.name 在加载之前)。始终使用默认搜索路径 classpath:,classpath:/ config,file:,file:config / ,无论 spring.config的值如何.location 。以这种方式,您可以在 application.properties 中设置应用程序的默认值(或者使用 spring.config.name )并在运行时使用不同的文件覆盖它,保留默认值。

If spring.config.location contains directories (as opposed to files) they should end in / (and will be appended with the names generated from spring.config.name before being loaded). The default search path classpath:,classpath:/config,file:,file:config/ is always used, irrespective of the value of spring.config.location. In that way you can set up default values for your application in application.properties (or whatever other basename you choose with spring.config.name) and override it at runtime with a different file, keeping the defaults.

这篇关于Spring Boot和多个外部配置文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆