我有多个要从类路径加载的属性文件。有一个默认设置,/src/main/resources它是的一部分myapp.jar。我springcontext希望文件位于类路径中。即
/src/main/resources
myapp.jar
<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或配置中的所有属性。
spring boot doc config
applicaiton.propertiesfrom
当我对其进行测试时,只会application.properties拾取,其余属性仍会从拾取/src/main/resources。我尝试将它们作为逗号分隔的列表提供,spring.config.location但是默认设置仍然没有被覆盖。
application.properties
spring.config.location
如何使多个外部配置文件覆盖默认文件?
解决方法是,我目前使用app.config.location通过命令行提供的(特定于应用程序的属性)。即
app.config.location
java -jar myapp.jar app.config.location=file:./config
我改变了我的applicationcontext给
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参考指南中的“ 外部化配置 ”)。
*
解析属性时(即@Value("${myprop}")以相反的顺序进行解析(因此从9开始)。
@Value("${myprop}"
要添加其他文件,你可以使用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.name
classpath:,classpath:/config,file:,file:config/
更新:由于spring.config.location的行为现在将覆盖默认值,而不是添加至默认值。你需要使用spring.config.additional-location来保持默认值。这是从1.x到2.x的行为更改