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>

我还需要使用外部集来覆盖这些属性的选项。我有一个外部config文件夹在cwd。按照Spring启动doc配置文件夹应该在类路径。但它不清楚从doc如果它将只覆盖applicaiton.properties从那里或所有的配置中的属性。

当我测试它,只有application.properties被拾起,其余的属性仍然从/ src /主/资源。我试图提供他们作为逗号分隔的列表到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文件。

当使用Spring Boot时,属性按照以下顺序加载(参见Spring Boot参考指南中的Externalized Configuration)。

>命令行参数。
> Java系统属性(System.getProperties())。
> OS环境变量。
>来自java:comp / env的JNDI属性
>一个RandomValuePropertySource,只有随机的属性。
>您的打包的jar外部的应用程序属性(application.properties,包括YAML和配置文件变体)。
>在jar中打包的应用程序属性(application.properties,包括YAML和配置文件变体)。
> @Configuration类上的@PropertySource注释。
>默认属性(使用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引用参考指南的this section)。

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.

翻译自:https://stackoverflow.com/questions/25855795/spring-boot-and-multiple-external-configuration-files

转载注明原文:java – Spring引导和多个外部配置文件