单个弹簧轮廓的多个属性文件

时间:2019-05-13 18:41:53

标签: spring spring-boot

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

dev

application-dev.yml
application-dev.properties

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

是否可以为如下所示的配置文件提供多个配置文件?

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

4 个答案:

答案 0 :(得分:2)

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

让我们描述.properties文件:

初始方法

一个人可以这样使用它:

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

这很容易配置。限制是,您不能合并配置文件。我的意思是,当您要将配置文件用作dev,local时,其中local仅更改了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将所有配置文件集中在一个文件中,这可能是您想要的,也可能不是。 >

答案 1 :(得分: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 :(得分:1)

是的,有可能。 Cannot resolve symbol 'ProgressiveMediaSource' 用于外部化Spring Boot应用程序中的配置文件位置。这可以用来提供文件在文件系统中甚至在类路径中的位置。根据您希望提供给应用程序访问文件的方式,可以选择URI。

以编程方式进行:

spring.config.location

通过环境变量进行操作:

@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

答案 3 :(得分:0)

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

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

spring.profiles.include=redis, db

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