外置application.yml读取异常Bug记录
排查问题
大年二十七,公司马上要放假了,结果接到客户反馈前不久更新的服务数据库链接异常,报错信息为ORA-01017。引起这个报错通常可能是下面的原因:
-
Oracle用户过期
-
Oracle用户被锁定
-
配置文件密码错误
-
配置文件的编码异常,无法正确被解析
对这些问题一一排查后,竟然都是正常的!瞬间我整个人不正常了,到底是什么问题呢??????
补充一下项目部署目录的文件结构:
|-app.jar
|-application.yml
|-application-prod.yml
|-start.sh
application.yml和application-prod.yml都和app.jar同级,并且application.yml中的active就是prod。
springboot配置文件读取优先级
我们知道在springboot项目中外置的yml文件优先级如下:
- file:./config/ ,即优先读取jar包外的config目录中的配置文件
- file:./ ,即第二顺序读取jar包外的config目录同级的配置文件
- classpath:/config/ ,即第三顺序读取jar包内classpath下/config文件夹内的配置文件
- 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也是一样的。这个问题后续有空会好好研究一下,后续结果后更新~