从命令行在Spring Boot中使用多个外部属性文件

时间:2018-09-19 11:57:20

标签: java spring-boot properties-file

我想从外部位置读取2个属性文件。 它需要通过命令行参数加载。

  1. configuration.properties->这是一个普通的属性文件,包含公共信息。

  2. 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)中,我将具有不同的路径。

因此,命令行是我的选择,也需要将属性保持在外部。

这是我尝试的组合吗?


  • 命令行:

    1. 为安全提供类路径。属性

      -Dspring.config.location=file:C:\Project\properties\configuration.properties, classpath:C:\Project\properties\security\dev\
      
    2. 给予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
      
    3. 尝试将\更改为/


  • 传递的网址路径

    1. ("secure.properties"); //预期在加载类路径时工作

    2. ("/secure.properties"); //预期在加载类路径时工作


  

以上组合均无效。

     

有什么想法吗?还是我错过了什么?

     

很长的问题的道歉。

2 个答案:

答案 0 :(得分:1)

24.3应用程序属性文件

SpringApplication在以下位置从application.properties文件加载属性,并将其添加到Spring Environment:

  1. 当前目录的/ config子目录
  2. 当前目录
  3. 类路径/ config包
  4. classpath根

列表按优先级排序(在列表较高位置定义的属性会覆盖在较低位置定义的属性)。

[注意]您还可以使用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")})