转载

SpringBoot外部化配置文件实践

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

  • 如需自定义名称可使用 spring.config.name="custom"
  • 如需自定义扫描目录可以使用 spring.config.location="/Users/tengchong/Desktop/" ,添加后扫描目录将变为:
    classpath:
    classpath:/config
    file:
    file:config/
    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/ 后可以成功启动

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/ 目录的原因请告知,感谢

如有错误请指出,感谢

原文  https://juejin.im/post/5d2ea85b5188253e215ff2a6
正文到此结束
Loading...