SpringBoot外部化配置文件实践

3,358 阅读2分钟

简介

SpringBoot应用默认扫描了classpath:,classpath:/config,file:,file:config/目录下的application*配置文件,优先级从低到高。

  • 如需自定义名称可使用spring.config.name="custom"
  • 如需自定义扫描目录可以使用spring.config.location="/Users/tengchong/Desktop/",添加后扫描目录将变为:
    1. classpath:
    2. classpath:/config
    3. file:
    4. file:config/
    5. file:/Users/tengchong/Desktop/

优先级从低到高

jar包部署

打jar包部署可以在启动的时候通过spring.config.location去指定配置文件所在的目录,spring.profiles.active指定环境

  • 启动命令
java -jar easy-frame.jar --Dspring.config.location=/Users/tengchong/Desktop/ --spring.profiles.active=prod

启动时可以看到日志中输出的关于扫描配置文件的信息

13:09:51 demo [main] DEBUG o.s.b.c.c.ConfigFileApplicationListener - Activated activeProfiles prod
13:09:51 demo [main] DEBUG o.s.b.c.c.ConfigFileApplicationListener - Profiles already activated, '[dev]' will not be applied
13:09:51 demo [main] DEBUG o.s.b.c.c.ConfigFileApplicationListener - Loaded config file 'jar:file:/Users/tengchong/Desktop/easy-frame.jar!/BOOT-INF/classes!/application.yml' (classpath:/application.yml)
13:09:51 demo [main] DEBUG o.s.b.c.c.ConfigFileApplicationListener - Loaded config file 'file:./application-prod.yml' (file:./application-prod.yml) for profile prod
13:09:51 demo [main] DEBUG o.s.b.c.c.ConfigFileApplicationListener - Loaded config file 'jar:file:/Users/tengchong/Desktop/easy-frame.jar!/BOOT-INF/classes!/application-prod.yml' (classpath:/application-prod.yml) for profile prod

日志中加载了3个配置文件分别为(加载顺序与优先级无关):

  1. classes!/application.yml jar中的通用配置
  2. file:./application-prod.yml /Users/tengchong/Desktop/目录下的prod环境对应配置
  3. classes!/application-prod.yml jar中的prod环境对应配置 其中classes!/application-prod.yml的配置重复部分会被file:./application-prod.yml覆盖 由于application.yml中配置了spring.profiles.active=dev所以此处提示Profiles already activated, '[dev]' will not be applied这里可以忽略,因为参数中的spring.profiles.active优先级高于此处。

war包部署

打war包部署可以通过设置JAVA_OPTS来自定义参数,这里以apache-tomcat-8.5.40为例说明

  • 修改bin/catalina.sh
vi ./bin/catalina.sh
  • 添加参数,在250行左右
JAVA_OPTS="$JAVA_OPTS -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dspring.config.location=/Users/tengchong/Desktop/ -Dspring.profiles.active=prod"
  • 保存后启动tomcat
./bin/startup.sh

日志中输出以下信息

13:23:53 demo [main] DEBUG o.s.b.c.c.ConfigFileApplicationListener - Activated activeProfiles prod
13:23:53 demo [main] DEBUG o.s.b.c.c.ConfigFileApplicationListener - Loaded config file 'file:/Users/tengchong/Desktop/application-prod.yml' (file:/Users/tengchong/Desktop/application-prod.yml) for profile prod

发现启动的时候应用没有扫描classpath:,classpath:/config,file:,file:config/目录仅扫描了spring.config.location指定的目录,具体原因未知暂时将应用中application.yml也放到/Users/tengchong/Desktop/后可以成功启动

如知晓tomcat下没有扫描`classpath:,classpath:/config,file:,file:config/`目录的原因请告知,感谢

13:26:51 demo [main] DEBUG o.s.b.c.c.ConfigFileApplicationListener - Activated activeProfiles prod
13:26:51 demo [main] DEBUG o.s.b.c.c.ConfigFileApplicationListener - Profiles already activated, '[dev]' will not be applied
13:26:51 demo [main] DEBUG o.s.b.c.c.ConfigFileApplicationListener - Loaded config file 'file:/Users/tengchong/Desktop/application.yml' (file:/Users/tengchong/Desktop/application.yml)
13:26:51 demo [main] DEBUG o.s.b.c.c.ConfigFileApplicationListener - Loaded config file 'file:/Users/tengchong/Desktop/application-prod.yml' (file:/Users/tengchong/Desktop/application-prod.yml) for profile prod

由于application.yml中配置了spring.profiles.active=dev所以此处提示Profiles already activated, '[dev]' will not be applied这里可以忽略或者删除/Users/tengchong/Desktop/application.yml中的spring.profiles.active=dev,因为JAVA_OPTS中的spring.profiles.active优先级高于此处。

如知晓tomcat下没有扫描classpath:,classpath:/config,file:,file:config/目录的原因请告知,感谢

如有错误请指出,感谢