我想从外部位置读取2个属性文件。 它需要通过命令行参数加载。
configuration.properties->这是一个普通的属性文件,包含公共信息。
secure.properties->其中包含加密的密码。
我提供了以下命令行参数
-Dspring.config.location=file:C:\Project\properties\configuration.properties, file:C:\Project\properties\security\dev\secure.properties
configuration.properties
的属性工作正常。因为我不是直接加载文件,而是使用该属性。
在这里,对于这个加密文件,我需要通过路径并显式加载,这不会发生。
此外,util EncryptedPropertiesReader
在jar中可用,因此无法对其进行修改。
在这里,要抓住的是我需要如何使用secure.properties
我们有一个EncryptedPropertiesReader
类。
它包含一个load(string path)
方法。
因此,我需要传递secure.properties
文件的路径。
即
String env = "dev"
Properties p = EncryptedPropertiesReader.load("security\" + env + "\secure.properties");
System.out.println(p); // null
在这里,我无法给出绝对路径,因为在不同的环境(Unix)中,我将具有不同的路径。
因此,命令行是我的选择,也需要将属性保持在外部。
这是我尝试的组合吗?
命令行:
为安全提供类路径。属性
-Dspring.config.location=file:C:\Project\properties\configuration.properties, classpath:C:\Project\properties\security\dev\
给予spring.config.nane
-D spring.config.name=configuration, secure - Dspring.config.location=file:C:\Project\properties\configuration.properties, file:C:\Project\properties\security\dev\secure.properties
尝试将\更改为/
传递的网址路径
("secure.properties");
//预期在加载类路径时工作
("/secure.properties");
//预期在加载类路径时工作
以上组合均无效。
有什么想法吗?还是我错过了什么?
很长的问题的道歉。
答案 0 :(得分:1)
24.3应用程序属性文件
SpringApplication在以下位置从application.properties文件加载属性,并将其添加到Spring Environment:
列表按优先级排序(在列表较高位置定义的属性会覆盖在较低位置定义的属性)。
[注意]您还可以使用YAML('.yml')文件来替代'.properties'。
如果您不喜欢application.properties作为配置文件名,则可以通过指定spring.config.name环境属性来切换到另一个文件名。您还可以通过使用spring.config.location环境属性(这是目录位置或文件路径的逗号分隔列表)来引用显式位置。
以下示例显示了如何指定其他文件名:
$ java -jar myproject.jar --spring.config.name=myproject
以下示例显示了如何指定两个位置:
$ java -jar myproject.jar
--spring.config.location=classpath:/default.properties,classpath:/override.properties
[警告] spring.config.name和spring.config.location很早就用于确定必须加载哪些文件,因此必须将它们定义为环境属性(通常是OS环境变量,系统属性,或命令行参数)。
如果spring.config.location包含目录(而不是文件),则它们应以/结尾(并且在运行时,应在加载之前附加从spring.config.name生成的名称,包括特定于配置文件的文件)名称)。在spring.config.location中指定的文件按原样使用,不支持特定于配置文件的变体,并且会被任何特定于配置文件的属性覆盖。
以相反的顺序搜索配置位置。默认情况下,配置的位置是
classpath:/,classpath:/config/,file:./,file:./config/.
结果搜索顺序如下:
file:./config/ file:./ classpath:/config/ classpath:/
使用spring.config.location配置自定义配置位置时,它们将替换默认位置。例如,如果将spring.config.location配置为值classpath:/ custom-config /,file:./ custom-config /,则搜索顺序如下:
file:./custom-config/ classpath:custom-config/
或者,当使用spring.config.additional-location配置自定义配置位置时,除默认位置外,还会使用它们。在默认位置之前搜索其他位置。例如,如果配置了classpath:/ custom-config /,file:./ custom-config /的其他位置,则搜索顺序变为:
file:./custom-config/ classpath:custom-config/ file:./config/ file:./ classpath:/config/ classpath:/
此搜索顺序使您可以在一个配置文件中指定默认值,然后在另一个配置文件中有选择地覆盖这些值。您可以在默认位置之一的application.properties(或使用spring.config.name选择的其他任何基本名称)中为应用程序提供默认值。然后,可以在运行时使用自定义位置之一中的其他文件覆盖这些默认值。
[注意]如果使用环境变量而不是系统属性,则大多数操作系统不允许使用句点分隔的键名,但是可以使用下划线(例如,使用SPRING_CONFIG_NAME代替spring.config.name)。
[注意]如果您的应用程序在容器中运行,则可以使用JNDI属性(在java:comp / env中)或servlet上下文初始化参数来代替环境变量或系统属性,或者与之一起使用。
答案 1 :(得分:1)
这是您可以使用环境变量从任何位置加载属性的方法
-Dspring.config.location="C:\Project\properties\", -Dsecure.properties.location="C:\Project\properties\security\dev\"
@PropertySources({
@PropertySource("file:${spring.config.location}/configuration.properties"),
@PropertySource("file:${secure.properties.location}/secure.properties")})