当前位置: 首页 > 知识库问答 >
问题:

spring boot和多个外部配置文件

陈寒
2023-03-14

我有多个属性文件要从类路径加载。在/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中不清楚它是否只会重写applicaiton.properties或config中的所有属性。

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

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

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

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

并且我将applicationcontext更改为

null

<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文件所做的那样。

共有1个答案

曹浩波
2023-03-14

更新:因为spring.config.location的行为现在重写了默认值,而不是添加到默认值。您需要使用spring.config.addition-location来保持默认值。这是从1.x到2.x的行为变化

使用spring boot时,属性按以下顺序加载(请参阅《spring boot参考指南》中的外部化配置)。

  1. 命令行参数。
  2. Java系统属性(System.GetProperties())。
  3. OS环境变量
  4. 来自Java的JNDI属性:comp/env
  5. 仅在random.*中具有属性的RandomValuePropertySource。
  6. 打包的jar之外的应用程序属性(application.properties包括YAML和profile变体)。
  7. 封装在jar中的应用程序属性(application.properties包括YAML和profile变体)。
  8. @PropertySource在@Configuration类上的批注。
  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生成的名称)。无论spring.config.location的值如何,默认搜索路径classpath:,classpath:/config,file:,file:config/始终使用。这样,您就可以在application.properties(或使用spring.config.name选择的任何其他basename)中为应用程序设置默认值,并在运行时用不同的文件重写它,保持默认值。

 类似资料:
  • 问题内容: 我有多个要从类路径加载的属性文件。有一个默认设置,它是的一部分。我springcontext希望文件位于类路径中。即 我还需要使用外部集覆盖这些属性的选项。我在中有一个外部配置文件夹cwd。按照文件夹应该在classpath上。但是从doc尚不清楚,它是否只会覆盖或配置中的所有属性。 当我对其进行测试时,只会拾取,其余属性仍会从拾取/src/main/resources。我尝试将它们作

  • 在springboot应用程序中,我有一个jar,然后是一个子目录config with application。属性,applicationContext。xml和log4j。。。属性文件。 我正在尝试外部化log4j配置。application.properties是这样外部化的。 但是,当springboot运行时,它使用jar文件中的log4j配置文件。通过使用-Dlog4j.debug选

  • 问题内容: 我正在开发Java桌面应用程序,并且想要一个外部configuration.xml。 我正在使用Netbeans开发应用程序,并尝试将config.xml文件添加到dist目录中,以使其驻留在应用程序工作文件夹中。但是,当Netbeans执行其清理操作时,它将删除dist目录, 我应该在何处放置此configuration.xml文件,以便它不会被删除并存在于应用程序启动目录中。 问题

  • 我有一个启动应用程序,部署到一个外部tomcat服务器,一切工作在我的本地与本地数据库。现在,我必须将代码推广到数据库配置不同的更高环境。我读了很多关于配置文件的etc...,但是当它是一个外部tomcat并且不使用

  • 寻找在Springboot应用程序中配置多个配置文件特定属性文件的最佳方法。下面是一个例子: -资源  · --application.properties  · · · · · --德夫             --application-dev.properties             --ldap-dev.properties             --Quartz-Dev.Prope

  • 本文向大家介绍SpringBoot内部外部配置文件加载顺序解析,包括了SpringBoot内部外部配置文件加载顺序解析的使用技巧和注意事项,需要的朋友参考一下 内部配置加载顺序 SpringBoot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件 –file:./config/ –file:./ –cl