我们正在使用弹簧靴2.0.0
。我们有三个环境dev
,staging
,production
。我们当前的配置结构
dev
application-dev.yml
application-dev.properties
同样,对于每个环境,我们都有一个yml
和properties
文件。经过一年的开发,现在,配置文件的单个yml
文件成为一个大型的整体配置。
是否可以为如下所示的配置文件提供多个配置文件?
application-dev.yml
application-dev-sqs.yml
application-dev-redis.yml
答案 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的方法-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
为例,您想为redis
和db
加载其他属性。在application.properties
文件中,添加:
spring.profiles.include=redis, db
这将分别加载文件application-redis.properties
和application-db.properties