当前位置: 首页 > 面试题库 >

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 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上的所有外部配置文件。


问题答案:

使用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的行为更改



 类似资料:
  • 我有多个属性文件要从类路径加载。在下有一个默认设置,它是的一部分。我的希望文件位于类路径上。即。 我还需要用外部集重写这些属性的选项。我在中有一个外部配置文件夹。根据spring boot,文档配置文件夹应该在类路径上。但从doc中不清楚它是否只会重写或config中的所有属性。 当我测试它时,只有被提取,其余属性仍然从中提取。我尝试将它们作为逗号分隔的列表提供给,但默认设置仍未被覆盖。 如何使多

  • 在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