替换SpringBoot里的文件

现在使用Spring Boot架构的应用开发来说是非常的普遍,统一化的打包部署确实带来不少便利,但当遇到问题时也是会比较棘手。或许你会觉得很惊讶,但如果说这是产品部署运维过程中遇到的难题需要修改Spring Boot应用程序,你就会觉得困难也是不奇怪的。本文就来分享下如何使用jar命令应对线上部署产品时,要临时替换Spring Boot应用中的Jar包的操作。

在测试环境部署某个产品应用时,在最后启动时遇到失败,查看并分析启动日志,发现了如下的堆栈日志信息:

spring-boot-replace-jar-01.png

看到此MySQL驱动的类名,当时心中已经有了答案,估计肯定是因为高版本的MySQL驱动程序不兼容低版本的MySQL Server所引起的。接下来使用如下的 jar 命令进一步确认下便是:

1
2
$ jar -tvf semxxx.jar | grep mysql
mysql-connector-java-8.0.12.jar

当前测试环境使用的 VM 集成镜像,里面很多组件版本相对比较低,但一直使用都没有问题也未曾再升级。

从上面错误的堆栈日志中有看到DruidDataSource字样,猜测此开发使用了Druid数据库连接池,那还是很有希望的,因为Druid数据库连接池有个自动适配数据库驱动程序类的能力特性,但愿开发在写代码时没有使用硬编码的形式。

网上搜索了一些关于 jar 命令如何打包有主运行程序的JAR包后,便着手开始替换MySQL程序的工作。相关步骤如下:

  • 解压产品打包好的spring-boot应用程序
1
$ jar xf semantic-xxxx.jar -C tmp/
  • 删除lib目录下的MySQL高版本驱动
1
2
$ cd ./tmp/BOOT-INF/lib/
$ rm -rf mysql-connector-java-8.0.16.jar
  • 添加低版本的MySQL驱动包
1
2
$ cd ./tmp
$ cp ~/mysql-connector-java-5.1.34-bin.jar ./BOOT-INF/lib/
  • 修改classpath.idx文件中的JAR列表
1
2
3
$ cd ./tmp/BOOT-INF/
$ vim classpath.idx
$ # 把那个高版本驱动程序JAR名称修改成低版本的名称即可
  • 重新打包Jar
1
2
$ cd ./tmp
$ jar cfM0 semantic-xxxx.jar .

最后就是重新启动应用程序,“万幸”我们的程序员们没有写硬编码,启动成功,如愿进入到了产品的操作界面,功能使用也一切正常。

参考文章: