外置application.yml读取异常Bug记录

外置application.yml读取异常Bug记录

排查问题

大年二十七,公司马上要放假了,结果接到客户反馈前不久更新的服务数据库链接异常,报错信息为ORA-01017。引起这个报错通常可能是下面的原因:

  1. Oracle用户过期

  2. Oracle用户被锁定

  3. 配置文件密码错误

  4. 配置文件的编码异常,无法正确被解析

对这些问题一一排查后,竟然都是正常的!瞬间我整个人不正常了,到底是什么问题呢??????

补充一下项目部署目录的文件结构:

|-app.jar
|-application.yml
|-application-prod.yml
|-start.sh

application.yml和application-prod.yml都和app.jar同级,并且application.yml中的active就是prod。

springboot配置文件读取优先级

我们知道在springboot项目中外置的yml文件优先级如下:

  1. file:./config/ ,即优先读取jar包外的config目录中的配置文件
  2. file:./ ,即第二顺序读取jar包外的config目录同级的配置文件
  3. classpath:/config/ ,即第三顺序读取jar包内classpath下/config文件夹内的配置文件
  4. classpath:/ ,即第四顺序读取jar包内classpath中的配置文件

解决办法

最终抱着死马当活马医的态度,我准备将程序的jar包解压,把外置配置文件替换到jar包内重新启动,解压后的目录结构如下:

# 解压jar包 到xxx目录
unzip xxx.jar -d xxx

# 也可以使用jar命令解压,但是jar命令无法指定解压到的目录
jar -xvf xxx.jar

解压后的文件目录如下:

|-BOOT-INF
|--classes
|--lib
|-META-INF
|-org

其中/BOOT-INF/classes内存放的是yml文件,将外置的yml文件复制到此目录下进行覆盖操作。

使用jar命令将文件压回

# 进入存放BOOT-INF、META-INF、org三个文件夹的目录
cd /xxx

# 压缩三个目录为jar包,取名为xxx.jar
jar cfM0 xxx.jar *

将jar包打包放到服务器,删除所有外置文件重新启动

奇迹发生了,程序一切正常~~~~~~~终于可以安心过年了。。。。。。。。。。。

后续我又在测试环境检查了外置文件,默认读取的确实是外置的文件,甚至使用md5sum命令计算了两个jar包的MD5也是一样的。这个问题后续有空会好好研究一下,后续结果后更新~

上一篇:Python+selenium自动化:页面加载慢、超时加载情况下内容已经加载完毕的快速执行脚本解决方案,页面加载时间过长优化方案


下一篇:详解生成器 | 手把手教你入门Python之八十一