【问题标题】:Multiple properties file for a single spring profile单个弹簧轮廓的多个属性文件
【发布时间】:2019-09-30 18:09:18
【问题描述】:

我们正在使用弹簧靴2.0.0。我们有三个环境devstagingproduction。我们当前的配置结构

dev

application-dev.yml
application-dev.properties

同样,我们为每个环境都有一个ymlproperties 文件。经过一年的开发,现在用于配置文件的单个 yml 文件成为一个大型的整体配置。

下面的配置文件是否可以有多个配置文件?

application-dev.yml
application-dev-sqs.yml
application-dev-redis.yml

【问题讨论】:

  • 你有没有试过更好地告诉你所面临的问题
  • 我在src/main/resources 中放置了配置,但只加载了application-{profile}.yml or application-{profile}.properties。我阅读了 spring 文档,没有明确的定义来加载多个配置文件 yml 文件。
  • 所以要加载所有配置文件?或特定的个人资料?
  • 基本上,我想根据(sqs、redis、elastic)等类别对配置文件配置进行分组。在这种情况下,对于开发配置文件,它将是 application-dev-sqs.yml、application-dev-redis.yml 和 ...

标签: spring spring-boot


【解决方案1】:

我认为有两种方法可以实现这一要求。

spring.profiles.active 接受以逗号分隔的活动配置文件列表,因此您始终可以提供 dev,dev-sqs,dev-redis 作为值。

另一种方法是使用@PropertySource 和自定义PropertySourceFactory 来实现此要求。您可以在下面的文章中找到一种实现,该实现采用来自 spring.profiles.active 的值来加载相应的 YAML 文件。通过在 YAML 文件的名称中查找配置文件 id 来调整实现以加载多个文件应该非常容易。

[How-to] Read profile-based YAML configurations with @PropertySource

【讨论】:

  • 谢谢 :),试试看
【解决方案2】:

我正在处理类似的问题,我建议使用 yaml 配置。

让我们描述.properties文件:

初步方法

可以这样使用:

@Component
@PropertySources({
    @PropertySource("classpath:application.properties"),
    @PropertySource("classpath:application-${spring.profiles.active}.properties")
})
public class AppProperties {
}

这很容易配置。限制是,您不能合并配置文件。我的意思是,当您想将配置文件用作dev,locallocal 只是更改dev 配置文件的一些配置属性时,Spring 将尝试加载application-dev,local.properties 文件,这很可能不是您想要的。

顺便说一句,这就是 Spring 会自动为你做的事情,这对你描述的主题很有用。

没有办法为每个配置文件(而不是整个列表)配置它。另一种可能性是,可以在spring.config.name 中指定列表,目前情况并非如此。

更好的方法

简而言之,使用:

@Profile("dev")
@Configuration
@PropertySources({
        @PropertySource("classpath:topic1-dev.properties"),
        @PropertySource("classpath:topic2-dev.properties")
})
public class AppPropertiesDev {
}

缺点是,你必须有几个这样的配置类(dev、staging),但要知道你有主题。您还可以使用多个配置文件,它们按您指定的顺序加载 (as of my testing)。这样,您的开发人员可以轻松地使用开发配置并更改他/她的测试所需的内容。

Yaml 方法

您可以查看我之前提出的问题中的 yaml 方法 - Property resolving for multiple Spring profiles (yaml configuration),好处是文件数量较少 - yaml 将所有配置文件放在一个文件中,这可能是也可能不是您想要的。

【讨论】:

    【解决方案3】:

    是的,这是可能的。 spring.config.location 用于将 Spring Boot 应用程序中的配置文件位置外部化。这可用于在文件系统甚至类路径中提供文件的位置。根据您希望为应用程序提供文件访问权限的方式,您可以选择 URI。

    以编程方式进行:

    @SpringBootApplication
    public class Application {
    
      public static void main(String[] args) {
    
        ConfigurableApplicationContext applicationContext = new SpringApplicationBuilder(Application.class)
            .properties("spring.config.location:classpath:/application-dev.yml,classpath:/application-dev-sqs.yml,classpath:/application-dev-redis.yml")
            .build()
            .run(args);
        }
    }
    

    通过环境变量实现:

    set SPRING_CONFIG_LOCATION=classpath:/application-dev.yml, \
      classpath:/application-dev-sqs.yml, \
      classpath:/application-dev-redis.yml 
    

    因此,您可以将文件提供为逗号分隔值。

    我这里用过classpath,也可以是文件系统中的位置:

    /home/springboot-app/properties/application-dev.yml,/home/springboot-app/properties/application-sqs.yml,/home/springboot-app/properties/application-redis.yml
    

    【讨论】:

    • 谢谢,两个答案都试试
    【解决方案4】:

    您是否尝试过包含个人资料?

    以配置文件 default 为例,您想为 redisdb 加载其他属性。在application.properties 文件中,添加:

    spring.profiles.include=redis, db

    这将分别加载文件application-redis.propertiesapplication-db.properties

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-23
      • 2015-05-16
      • 2017-09-24
      • 2010-10-06
      • 2012-05-16
      • 1970-01-01
      相关资源
      最近更新 更多