点击上方 好好学java ,选择 星标 公众号

重磅资讯、干货,第一时间送达
今日推荐:iphone 也是办公神器,用了就知道了,不行送你一个试试个人原创+1博客:点击前往,查看更多
链接:https://segmentfault.com/a/1190000022043836

平时,项目的yaml格式或者properties格式的配置信息文件都固化在了项目jar包里面,不便于动态更改。之前我写过一小段时间的Go,我都是从Redis里读取了相关的配置之后,再完成项目的启动。于是乎,我想在Spring Boot里也捣鼓一下。

要完成配置文件的替换,那么必须在Spring Boot启动之前完成,也就是说像这样子

@SpringBootApplication
class Application
fun main(args: Array<String>) {// 加载配置文件,然后再运行↓将Spring Boot跑起来runApplication<Application>(*args)
}

实现

思路有了之后就简单了,一波操作

val logger = LoggerFactory.getLogger(RedisConfigLoader::class.java)val classLoader = RedisConfigLoader::class.java.classLoader
val url = classLoader.getResource("application.yaml")?: throw ConfigLoadingException("Cannot find the resource") // 自定义的异常
val path = Paths.get(url.toURI())
logger.info("Resource file path is $path")
val channel = FileOutputStream(path.toFile()).channelval host = args[0]
val port = args[1].toInt()
val password = args[2].toCharArray()
val key = args[3]val redisURI = RedisURI(host, port, Duration.ofSeconds(5)).apply { this.password = password }
val redisClient = RedisClient.create(redisURI)
val conn = redisClient.connect()
logger.info("Connected to Redis")val value = conn.sync().get(key)
if (value.isNullOrEmpty()) {throw ConfigLoadingException("Cannot read resource from redis with key named $key")
}
val buffer = ByteBuffer.wrap(value.toByteArray())
channel.write(buffer)channel.close()
conn.close()
redisClient.shutdown()
logger.info("Replaced the resource file successfully!")

在Idea里运行没问题,跑起来了,但是,当打包成jar包之后就行不通了,会爆异常

Caused by: java.nio.file.FileSystemNotFoundExceptionat jdk.zipfs/jdk.nio.zipfs.ZipFileSystemProvider.getFileSystem(ZipFileSystemProvider.java:166)

解决办法也很简单,把jar包解压出来跑????,实际上也不会很麻烦,解压在CI构建阶段完成即可。不过要完成项目的启动,必须先找到Spring Boot的启动类。打开jar包,查看里面的META-INF/MENIFEST.MF文件,可以看到Main-Class是org.springframework.boot.loader.JarLauncher那么我们的启动命令将改成这样就大功告成

java -cp /解压出来的文件夹根目录 org.springframework.boot.loader.JarLauncher redis 127.0.0.1 6379 redis_password app_config_key

重构

最后稍微重构一下代码 定义一个配置加载器接口

interface ConfigLoader {@Throws(ConfigLoadingException::class) // 自定义异常fun load(resourceName: String, args: Array<String>)
}

简单写个工厂

class ConfigLoaderFactory {companion object {fun loaderOf(type: String): ConfigLoader {return when (type) {"redis" -> RedisConfigLoader()else -> throw ConfigLoaderNotFoundException("Cannot find the config loader typed $type") // 自定义异常}}}
}

实现一个RedisConfigLoader,把之前的代码拷贝的load方法里,稍微改一下即可,完整代码点这里:https://gist.github.com/Nomyfan/5ec0d8f13b6f8e6faff1d14ac212377e

如何异地加载 Spring Boot 配置文件?相关推荐

  1. K8s 集群使用 ConfigMap 优雅加载 Spring Boot 配置文件

    文章目录 1.Spring Boot 加载配置介绍 2.环境.软件准备 3.Spring Boot 示例工程 Demo 4.K8s ConfigMap 加载工程配置文件 4.1.直接加载环境的配置文件 ...

  2. aws ena模块加载_在AWS上全自动实时重新加载Spring Boot应用程序

    aws ena模块加载 在这篇文章中,我们将研究Spring Boot的最佳机密之一: Spring Boot DevTools . 尽管可以在本地计算机上进行测试,但在与生产环境尽可能相似的环境中开 ...

  3. api报错 javaee maven_maven test 换javaee6 无法加载spring的配置文件 ?报错-问答-阿里云开发者社区-阿里云...

    maven 构建的springmvc项目,执行mvn test 时 如果是 org.apache.openejb javaee-api 5.0-3 那么执行test可以通过 如果将version改为6 ...

  4. Spring Boot 配置文件的加载优先级

    1. 前言 今天突发奇想,如果Spring Boot的配置文件同时存在application.properties和application.yaml,于是便测试了一波.结果测出来优先级的顺序为 pro ...

  5. Spring boot配置文件加载位置

    配置文件加载位置 springboot 启动 会扫描以下位置的application.properties 或者application.yml文件,作为Spring boot的默认配置文件 –file ...

  6. Spring加载多个配置文件

    对于大多数的应用,从表现层的action,到持久层的DataSource,都被Spring 作为 bean 管理.如果这些bean 被配置在同一个文件中,阅读及维护该配置文件将是一件非 常有挑战的事情 ...

  7. 手动加载spring配置文件

    更多Java架构师核心资料持续更新中https://github.com/kepeihong/data.git,内推阿里请查看链接 手动加载Spring配置文件有两个类,分别是ClassPathXml ...

  8. Spring Boot配置文件学习记录【1】

    [1]Spring Boot配置文件 Spring Boot配置层面的知识已学习完.总结一下本周的学习内容,一切都需要从@SpringBootApplication谈起,因为它,做到了真正配置文件的简 ...

  9. Spring Boot配置文件放在jar外部

    Spring Boot配置文件放在jar外部 2018年03月16日 10:09:17 qq_37334435 阅读数:1488 Spring Boot程序默认从application.propert ...

最新文章

  1. 传统数据中心穿上“云”外衣 任重而道远
  2. linux 空闲等待时间TMOUT 反空闲设置 简介
  3. fiddler修改接口请求返回数据Response的三种方法
  4. nginx 安装与配置
  5. JS 设计模式 四(单例)
  6. windows winrar 指令_【转】winrar命令行详解
  7. 【黑客帝国数字雨屏保】基于Win32的黑客帝国数字雨屏幕保护程序(附VS工程代码文件和可执行文件)
  8. 可靠性测试设备技术含量_品牌手机厂商为何如此重视可靠性测试,海拓仪器一语道破玄机...
  9. 网上图书商城项目学习笔记-008修改密码功能
  10. 解决npm npm does not support Node.js
  11. DAX/PowerBI系列 - 参数表(Parameter Table) - 大客户分析(Top N)
  12. Excel从右向左查找
  13. pdf拆分成一页一页,pdf拆分方法
  14. cordova 美洽_phonegap-cordova-美洽客服插件-Android
  15. 最新版 | 2020李沐《动手学深度学习》中文版pdf重磅开源!
  16. 查看磁盘文件夹大小工具WinDirStat
  17. NGFF、M.2、PCIe、NVMe概念区分以及PCIEx1 x4 x8 x16区别
  18. 【013】故宫博物院数字文物库-让文物随时可赏
  19. java实现树形菜单_Java构建树形菜单的实例代码(支持多级菜单)
  20. PRD(Product Requirement Document,产品需求文档)模板

热门文章

  1. iis出现 Server Application Error 错误解决方法(xp iis5.1 配置asp项目出现500错)
  2. js代码收集(1)_隐藏div、table间隔样式设置
  3. sql getdate() 时间格式设置
  4. Silverlight+WCF 实战-网络象棋最终篇之非线程阻塞倒计时窗口(四)
  5. 访问备份数据寄存器时,需要打开BKP时钟吗?
  6. 聚类算法(1):K-Means算法
  7. C++ Primer 5th笔记(chap 18 大型程序工具) using指示
  8. 《研磨设计模式》chap12 观察者模式observer(2)模式介绍
  9. 近世代数--内外直积--本质是一样的
  10. IDA pro 使用笔记