【问题标题】:Using two yaml files for configuration properties为配置属性使用两个 yaml 文件
【发布时间】:2017-02-16 16:26:35
【问题描述】:

我们正在使用 Spring Boot 应用程序,其中属性从 application.yml 文件而不是 application.properties 加载,位于 src/main/resources/,如下所示:

config: 
  host: localhost:8080  
  server: 123  

他们被拉入一个像这样的.java文件

@ConfigurationProperties( prefix="config")  
public class ConnectionImpl implements Connection{
  @Value("${config.host}")
  private Stringhost;
} 

我可以通过这种方式检索属性。 但是我们正在尝试将配置属性从application.yml 移动到位于不同位置的不同.yml 文件。 (src/main/resources/env-config)。
现在我无法以相同的方式检索属性,即使用 @Value 注释。我还需要添加其他注释吗?

【问题讨论】:

  • 您需要同时加载两个 yaml 属性还是在不同的环境中加载 - 例如。开发/测试/生产环境?另外,您需要配置属性还是可以使用属性源?例如。 @PropertySource("classpath:${some.file.name}.yaml") - 这样您就可以在 java 命令行启动调用中使用操作系统环境变量 SOME_FILE_NAME 或 -Dsome.file.name= 之类的参数。跨度>
  • 我们同时需要两者。我们需要配置属性。
  • 在这种情况下,我需要混合多个属性文件 + 环境变量。例如,我有一个“jms..yaml”和一个“db..yaml”,甚至还有一个“utils..yaml”。这些文件中的每一个都有一个用 @PropertySource("classpath:/com/${my.path:default/path}/db.${env:local}.properties") 注释的 pojo - 您可以使用 -Dmy 覆盖它.path=path/to/yaml/files 和 -Denv=dev 在命令行中 - 因此,如果您将 yaml 打包到 jar 中,它会在那里找到道具,但如果您需要将其更改为文件系统上的 yaml 文件, 你也可以在那里覆盖它。
  • 抱歉,我用 PropertiesSource 回答了,但您也应该可以使用 ConfigurationProperties 来代替,使用相同的模型,它会自动为您构建 Spring Boot。

标签: java spring-boot properties configuration yaml


【解决方案1】:

来自documentation

SpringApplication 将从以下位置的application.properties(或application.yml)文件中加载属性并将它们添加到Spring Environment

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

如果你不喜欢 application.properties 作为配置文件名,你可以通过指定 spring.config.name 环境属性来切换到另一个。 您还可以使用spring.config.location 环境属性(以逗号分隔的目录位置或文件路径列表)引用显式位置

无论spring.config.location 的值如何,始终使用默认搜索路径classpath:,classpath:/config,file:,file:config/。此搜索路径按优先级从低到高排序(file:config/ 获胜)。如果您确实指定了自己的位置,它们将优先于所有默认位置并使用相同的最低到最高优先级排序。通过这种方式,您可以在 application.properties(或您使用 spring.config.name 选择的任何其他基本名称)中为您的应用程序设置默认值,并在运行时使用不同的文件覆盖它,保持默认值。

您需要提供一个命令行参数,告诉SpringApplication 具体查找位置。如果resources/ 中的所有内容都添加到类路径根目录中,那么您的命令行将如下所示:

java -jar myproject.jar --Dspring.config.location=classpath:/env-config/service-config.yml

如果您在resources/ 下有一个通用的application.yml,则其中的属性仍将被加载,但优先级低于命令行中指定的属性文件。

【讨论】:

    【解决方案2】:

    您的问题并没有真正说明您打算做什么,但是如果您想针对不同的环境进行不同的配置(例如developmenttestproduction),有一个简单的解决方案.

    将配置文件放置在项目中的文件层次结构中,如下所示:

    src/
      main/
        resources/
          application.yml
          application-development.yml
          application-test.yml
          application-production.yml
    

    当你现在开始你的应用程序时

    java -jar mySpringApplication.jar -Dspring.profiles.active=development
    

    application.yml 中的配置将被视为“基础层”,被application-development.yml 中的配置覆盖。这样,您可以在application.yml 中为所有环境设置“默认”设置,并在application-ENV.yml 文件中设置特定于环境的配置。 testproduction 也是如此。

    【讨论】:

      【解决方案3】:

      没有。

      如果您避免在代码库中像这样对文件路径进行硬编码,您将处于一个更好的位置。 @ConfigurationProperties 曾经有一个 locations 属性,但它已被弃用并已在 1.5 中删除。

      在 Spring Boot 中,您配置 Environment,这是您配置的单一事实来源。您应该配置 Spring Boot 以读取您想要的文件,而不是将设置隐藏在代码中。 Read the documentation for spring.config.location。如果您想以更透明的方式执行此操作,也许EnvironmentPostProcessor is what you need

      【讨论】:

      • 嗨斯蒂芬妮,感谢您的回答。不确定您对使用 spring.config.location 的含义。在我的 application.yml 中,我使用 config: location: classpath:/env-config/service-config.yml 给出了我正在使用的另一个 yaml 的位置。但它仍然没有从这里挑选属性。
      • 阅读文档应该会有所帮助。您不能在那里指定该属性,它必须在应用程序启动时设置。有关详细信息,请参阅我提供的链接。
      猜你喜欢
      • 2020-06-05
      • 2020-07-06
      • 1970-01-01
      • 2021-05-12
      • 2015-11-24
      • 2017-11-07
      • 1970-01-01
      • 2016-02-05
      • 1970-01-01
      相关资源
      最近更新 更多