参考文档:profile之springboot
另外一种多配置文件方式参考:maven profile
1. 简介
想必大家都有这种经历,我们开发项目的时候要有多个环境,如开发环境、测试环境、生产环境,他们的配置文件一般不同,如数据库地址。当我们要向各个环境发布程序时,需要人工处理这些配置文件,这显然麻烦且易错。有了 profile,一切问题就简单了。简单讲 profile 就是一组配置,不同 profile 提供不同组合的配置,程序运行时可以选择使用哪些 profile 来适应环境。
2. 多配置文件
多个 application-{profile}.properties 文件
我们先来搭建一个简单的 springboot 项目快速了解多 profile 的使用。项目结构非常简单:
除了 application.properties 还有多个 application-{profile}.properties(格式必须为这样),在每个配置文件中项目启动的端口是不一样的。
在 application.properties 使用 spring.profiles.active=prod 来指定生效的配置文件为 application-prod.properties. 启动项目后可以在控制台看到启动端口为 application-prod.properties 里配置的 server.port=8084
2.1 profile 多种激活方式
-
第一种就是上面的在配置文件中通过 spring.profiles.active= 来指定,注意可以激活多个 profile,如
spring.profiles.active=prod, dev
如果都存在某值,执行 last win 策略。 -
通过命令行方式。优先级高于第一种的spring.profiles.active
- 执行
java -jar xxx.jar
,可以观察到服务端口被设置为 8082。 - 执行
java -jar xxx.jar –spring.profiles.active=test
,可以观察到服务端口被设置为8083,也就是(test)环境的配置
- 执行
-
通过虚拟机参数。-Dspring.profiles.active=dev
-
使用编程的方式激活
@SpringBootApplication public class Application { public static void main(String[] args) { ConfigurableApplicationContext applicationContext = SpringApplication.run(Application.class, args); applicationContext.getEnvironment().setActiveProfiles("dev"); } }
2.2 spring.profiles.include 属性
意思是无论执行哪个 profile,都会去加载 application-mq.properties 里的配置。但是注意,只会去加载application-mq.properties 里独有的配置,如果 application-mq.properties 也有 server.port 字段并不会生效。
可以利用这种方式简化配置文件的书写,如在 application-mq.properties 书写各个环境都有的 mq 配置信息,不必都夹杂在 application.properties 里。
2.3 总结
- application.properties 文件是必定要加载的,而且是先加载的,无论是通过哪种方式指定的。
- 当加载完 application 文件之后才加载指定的 profiles 文件
- 如果 application 文件和指定的 profile 文件有相同的配置或冲突的配置项,则以 profile 中的为基准
- application 文件中写通用的配置项,profile 文件中写特定环境的配置项,spring.profiles.include 指定公共的配置项(起到了分离的作用),这样可以简化配置文件的书写。