此处以数据源配置为例子,实际任何属性都可。

此方式,可解决修改配置文件,还要重新打包的问题

并且配置文件中的数据修改后,不需要重启服务器,也可获取最新修改后的配置信息。

步骤一:

启动类添加以下代码:

开启一个线程去定时刷新配置文件

@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
public class MyApplication implements ApplicationRunner{public static void main(String[] args) {// System.setProperty("spring.devtools.restart.enabled", "false");SpringApplication.run(MyApplication.class, args);System.out.println("启动成功");}/**----------------------------------------------- 添加start ---------------------------------------------*/private static ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);private static String profile;@Overridepublic void run(ApplicationArguments applicationArguments) throws Exception {scheduleUpdateConf();}private void scheduleUpdateConf() {try {Map lhm = YmlUtil.loadYaml("application.yml");profile = (String) YmlUtil.getValByKey(lhm, "spring.profiles.active");} catch (Exception e) {System.out.println("加载配置文件application.yml异常");}// 开启定时刷新内存中配置文件内容System.out.println("refresh config file start");executorService.scheduleAtFixedRate(RuoYiApplication::updateConfVal, 0, 10, TimeUnit.SECONDS);System.out.println("refresh config file end");}/*** 更新配置文件值*/private static void updateConfVal(){try{Map lhm = YmlUtil.loadYaml("application-" + profile + ".yml");String url = YmlUtil.getValByKey(lhm,"spring.datasource.druid.master.url").toString();String username = YmlUtil.getValByKey(lhm,"spring.datasource.druid.master.username").toString();String password = YmlUtil.getValByKey(lhm,"spring.datasource.druid.master.password").toString();DruidDynamicConfig instance = DruidDynamicConfig.getInstance();if (!instance.getDynamicUrl().equals(url)) {instance.setDynamicUrl(url);}if (!instance.getDynamicUsername().equals(username)) {instance.setDynamicUsername(username);}if (!instance.getDynamicPassword().equals(password)) {instance.setDynamicPassword(password);}} catch (Exception e){// System.out.println("更新配置文件值异常: ", e);}/**----------------------------------------------- 添加end ---------------------------------------------*/}

步骤二:

修改属性的实例化,添加此实体类

/*** 动态数据源配置实体类*/
public class DruidDynamicConfig {   private static String url;private static String username;private static String password;private final static DruidDynamicConfig dynamic;static {dynamic = new DruidDynamicConfig();}private DruidDynamicConfig() {url = "";username = "";password = "";}public static DruidDynamicConfig getInstance() {return dynamic;}public String getDynamicUrl() {return url;}public void setDynamicUrl(String url) {this.url = url;}public String getDynamicUsername() {return username;}public void setDynamicUsername(String username) {this.username = username;}public String getDynamicPassword() {return password;}public void setDynamicPassword(String password) {this.password = password;}
}

步骤三:

添加Yml工具类:YmlUtil.java

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.LinkedHashMap;
import java.util.Map;
import org.yaml.snakeyaml.Yaml;/***   @Description 动态操作yml配置文件工具类*   【需要将config配置文件夹和项目jar包放在同级别目录下,这样修改config下的配置文件后,jvm才能 *    及时得获取新的配置】*/
public class YmlUtil {public static LinkedHashMap loadYaml(String fileName) throws Exception{String path = System.getProperty("user.dir");File file = new File(path + "/config/" + fileName);InputStream in;if (file.exists()) {in = new FileInputStream(path + "/config/" + fileName);} else {// TODO 如果没有config文件夹,则从项目的resources目录下找in = YmlUtil.class.getClassLoader().getResourceAsStream(fileName);}LinkedHashMap lhm = new Yaml().loadAs(in, LinkedHashMap.class);return lhm;}public static Object getValByKey(Map lhm, String key) throws Exception{String[] keys = key.split("[.]");Map ymlInfo = lhm;for (int i = 0; i < keys.length; i++) {Object value = ymlInfo.get(keys[i]);if (i < keys.length - 1) {ymlInfo = (Map) value;} else if (value == null) {throw new Exception("key不存在");} else {return value;}}return null;}
}

步骤四:

将 application.yml 和 application-dev.yml 文件进行拷贝,放置到jar同目录下的config文件夹中(没有config创建即可)

这样就完成了动态加载yml配置信息的工作了,只要yml文件有修改,就会动态去监听并加载。

SpringBoot yml配置文件jar包外修改(动态生效)相关推荐

  1. 如何读取jar包外的properties和log4j.properties等配置文件

    一般在项目中使用properties配置文件的时候都将相关的properties文件放在src目录下,在将该app打包生成jar后,相应的properties配置文件生... 一般在项目中使用prop ...

  2. Java如何读取JAR包外的properties文件及打成jar包后无法读取到jar包内的properties文件

    项目中,经常把一部分功能独立出来,做一个java  project,然后打成jar包供其他项目引用.这时候,如果jar包中需要读取配置文件信息,则很少把该配置打进jar包,因为它不方便修改,更多都是采 ...

  3. 如何读取jar包外的properties文件和log4j.properties

    2019独角兽企业重金招聘Python工程师标准>>> 时间有限,不做排版和具体讲述问题产生的过程,下面是我的解决方案,已证实有效,其中Log4jP = "log4j.pr ...

  4. springboot打包为jar包和war包的区别

    为什么springboot更支持打包为jar包 springboot打包为jar包和war包的区别 在springboot项目中使用的是springboot内嵌的tomcat容器,而war包是运行在外 ...

  5. java jar 启动项目,SpringBoot项目运行jar包启动的步骤流程解析

    SpringBoot项目在开发中,方便快捷,有一点原因就是SpringBoot项目可以打jar包运行:把jar包直接扔服务器上,然后运行jar包就能访问项目接口了.下面介绍SpringBoot项目打j ...

  6. springboot启动报jar包加载异常问题解决

    问题描述: springboot启动报jar包扫描错误,但不影响项目正常使用: Failed to scan [file:/Users/ds/.m2/repository/com/sun/xml/bi ...

  7. 记录springBoot项目使用jar包中的mapper报错问题

    记录springBoot项目使用jar包中的mapper报错问题 背景 双数据源的实现 启动时报找不到对应的service 启动报mapper找不到 启动报no sqlsessionfactory 启 ...

  8. 关于SpringBoot项目通过jar包启动之后无法读取项目根路径静态资源

    前言:这个是昨天晚上在部署一个项目的时候发现的,在此记录一下 关于SpringBoot项目通过jar包启动之后无法读取项目根路径静态资源 问题描述 在部署了一个项目之后,打开项目页面进行测试,发现有一 ...

  9. 使用idea 在springboot添加本地jar包的方法 部署的时候本地jar没有包含的解决方法

    使用idea 在springboot添加本地jar包的方法 部署的时候本地jar没有包含的解决方法 参考文章: (1)使用idea 在springboot添加本地jar包的方法 部署的时候本地jar没 ...

最新文章

  1. 传感器数据完善 AI 功能,激起机器人“网络效应”
  2. MySql中把一个表的数据插入到另一个表中的实现代码--转
  3. 解决ftp的pasv模式下iptables设置问题
  4. 浪漫的表白 (5 分)
  5. HBase1.2.3 数据模型
  6. cdn.cdzk_页面“www.cdzkdc.com”HTTP状态检测结果- 站长工具
  7. 我的世界中国版服务器无限夜视,我的世界中国版怎么无限夜视_我的世界夜视药水怎么合成_我的世界怎么永久夜视...
  8. 武汉传媒学院有计算机专业吗,武汉传媒学院比较好的专业有哪些呢?
  9. 那些拆中台的CTO,70%被裁了
  10. USACO1.1.1 - PROB Your Ride Is Here
  11. 数据库期末总结笔记( 零基础 )-第二章 关系数据库
  12. IdentityServer4【Topic】之定义资源
  13. Markdown中如何添加特殊符号
  14. Sigfox被NB-IoT招安?这只是其成为物联网Uber的一个路径
  15. dbeaver(下载、安装图文过程)
  16. matlab实现PS算法之亮度调整
  17. 十二星座物语,女生最喜欢的星座性格【10】
  18. 华为--dis查看命令
  19. 易基因|新品:新型肿瘤标志物检测利器——cfDNA甲基化测序(cfDNA-RBS)
  20. android app连接打印机程序,Android App新增打印机支持 手机打印就是爽

热门文章

  1. matlab2015崩溃,ubuntu16.04上安装matlab 2015b,2016a的故障排除
  2. PMP二模知识点集锦
  3. Python爬虫实例:爬取 viveport 上 1406 款VR游戏信息
  4. mysql 基础(学习mysql必看)
  5. Three.js--》几何体顶点知识讲解
  6. Jenkins自动部署
  7. 2018洛奇英雄传永恒最新服务器,洛奇英雄传辅助
  8. android wifi 广播吗,Android WIFI开发之广播监听
  9. 大量Linux资源下载地址
  10. Gly-Gly-Arg, 54944-27-3/55033-48-2