一尘不染

Spring Boot和多个外部配置文件

java spring

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

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

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

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

当我对其进行测试时,只会application.properties拾取,其余属性仍会从拾取/src/main/resources。我尝试将它们作为逗号分隔的列表提供,spring.config.location但是默认设置仍然没有被覆盖。

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

解决方法是,我目前使用app.config.location通过命令行提供的(特定于应用程序的属性)。即

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

我改变了我的applicationcontext

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

这就是我在加载应用程序时如何在文件和类路径之间进行分隔的方法。
编辑:

//psuedo code

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

我真的不希望使用上述变通方法,而是让spring像在application.properties文件路径上那样覆盖classpath上的所有外部配置文件。


阅读 1150

收藏
2020-03-15

共1个答案

一尘不染

使用Spring Boot时,属性按以下顺序加载(请参阅Spring Boot参考指南中的“ 外部化配置 ”)。

  1. 命令行参数。
  2. Java系统属性(System.getProperties())。
  3. 操作系统环境变量。
  4. 来自java:comp / env的JNDI属性
  5. 一个RandomValuePropertySource,仅具有random。*属性。
  6. 打包的jar之外的应用程序属性(application.properties,包括YAML和配置文件变体)。
  7. 打包在jar中的应用程序属性(包括YAML和配置文件变体的application.properties)。
  8. @Configuration类上的@PropertySource批注。
  9. 默认属性(使用SpringApplication.setDefaultProperties指定)。

解析属性时(即@Value("${myprop}")以相反的顺序进行解析(因此从9开始)。

要添加其他文件,你可以使用spring.config.location以逗号分隔的属性文件或文件位置(目录)列表的属性。

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

上面的一个将添加一个目录,将在该目录中查询application.properties文件。

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

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

默认配置文件和位置在附加指定spring.config.location的文件和位置之前加载,这意味着后者将始终覆盖较早配置文件和位置中设置的属性。(另请参阅《 Spring Boot参考指南》的本节)。

如果spring.config.location包含目录(而不是文件),则目录应以/结尾(并spring.config.name在加载后附加从生成的名称)。classpath:,classpath:/config,file:,file:config/始终使用默认搜索路径,而与的值无关spring.config.location。这样,你可以在中设置应用程序的默认值application.properties(或使用来选择的其他任何基本名称spring.config.name),并在运行时使用其他文件覆盖它,并保持默认值。

更新:由于spring.config.location的行为现在将覆盖默认值,而不是添加至默认值。你需要使用spring.config.additional-location来保持默认值。这是从1.x到2.x的行为更改

2020-03-15