spring boot打包后的运行文件快速部署
文章目录
背景
有些时候会遇到一些特殊情况需要紧急对线上应用进行修复,而且没有办法本地重新打包发布时,利用jar命令进行更新或打包会是处理该问题的一种方式。
比如:这次我们需要紧急更新线上应用中的xml文件内的一段sql语句。
jar命令详解
命令行输入jar
可以看到该命令用法如下:
用法: jar {ctxui}[vfmn0PMe] [jar-file] [manifest-file] [entry-point] [-C dir] files ...
选项:
-c 创建新档案
-t 列出档案目录
-x 从档案中提取指定的 (或所有) 文件
-u 更新现有档案
-v 在标准输出中生成详细输出
-f 指定档案文件名
-m 包含指定清单文件中的清单信息
-n 创建新档案后执行 Pack200 规范化
-e 为捆绑到可执行 jar 文件的独立应用程序
指定应用程序入口点
-0 仅存储; 不使用任何 ZIP 压缩
-P 保留文件名中的前导 '/' (绝对路径) 和 ".." (父目录) 组件
-M 不创建条目的清单文件
-i 为指定的 jar 文件生成索引信息
-C 更改为指定的目录并包含以下文件
如果任何文件为目录, 则对其进行递归处理。
清单文件名, 档案文件名和入口点名称的指定顺序
与 'm', 'f' 和 'e' 标记的指定顺序相同。
示例 1: 将两个类文件归档到一个名为 classes.jar 的档案中:
jar cvf classes.jar Foo.class Bar.class
示例 2: 使用现有的清单文件 'mymanifest' 并
将 foo/ 目录中的所有文件归档到 'classes.jar' 中:
jar cvfm classes.jar mymanifest -C foo/ .
方式一:提取/更新方式完成替换
1、通过命令查找文件相对路径
$ jar tvf test.jar | grep "application"
852 Thu Aug 08 15:17:28 CST 2024 BOOT-INF/classes/application.yml
2、根据路径提取文件
$ jar xvf test.jar BOOT-INF/classes/application.yml
inflated: BOOT-INF/classes/application.yml
文件会被提取到 test.jar
同级目录中并且路径与jar包中存在路径一致
3、修改/替换目标文件
4、更新jar中的目标文件
$ jar uvf0 test.jar BOOT-INF/classes/application.yml
adding: BOOT-INF/classes/application.yml(in = 852) (out= 852)(stored 0%)
jar中的“-0”参数表示不进行压缩,仅用于存储
方式二:使用vim命令对简单文件进行编辑
如果只是简单编辑一下 jar
中的文本文件,例如说:application.yml
或者 xxx.xml
文件;
注意:此方法不适合编辑 jar
中某个 jar
中的文件;
1、编辑jar文件
$ vim test.jar
2、搜索jar中要编辑的文件
其中 :/
表示进入搜索模式,“application”表示要搜索的内容,然后可以按着‘n’找到下一个匹配结果、‘N’找到上一个匹配结果;
找到目标文件后按“回车”进入到文件编辑。
BOOT-INF/lib/micrometer-core-1.8.12.jar
BOOT-INF/lib/HdrHistogram-2.1.12.jar
BOOT-INF/lib/LatencyUtils-2.0.3.jar
BOOT-INF/lib/tomcat-embed-el-9.0.69.jar
BOOT-INF/lib/micrometer-registry-prometheus-1.8.12.jar
BOOT-INF/lib/simpleclient_common-0.12.0.jar
BOOT-INF/lib/commons-io-2.6.jar
BOOT-INF/lib/commons-lang-2.6.jar
BOOT-INF/lib/mybatis-plus-boot-starter-3.5.1.jar
BOOT-INF/lib/mybatis-plus-3.5.1.jar
BOOT-INF/lib/mybatis-plus-extension-3.5.1.jar
BOOT-INF/lib/mybatis-plus-core-3.5.1.jar
BOOT-INF/lib/mybatis-plus-annotation-3.5.1.jar
BOOT-INF/lib/jsqlparser-4.3.jar
BOOT-INF/lib/mybatis-3.5.9.jar
:/application
3、文件保存
文件编辑完成先输入“:wq”(先对目标的文本文件进行保存,然后退出)
然后再输入“:wq”(对 jar
目标的文本文件进行保存、退出操作)
方式三:解压jar然后重新打包
1、将jar包通过 7z 或者 The Unarchiver 等应用解压缩成目录
$ jar xf test.jar
2、在解压后的目录中找到需要替换的文件,执行替换操作
3、重新打包
$ jar -cfM0 test-1.jar *
# 对比一下原始的文件,可以发现由于没有使用压缩,重新打包后的文件会大很多
$ ll
total 760920
drwxr-xr-x. 4 root root 4096 Aug 8 15:17 BOOT-INF
-rw-r--r--. 1 root root 519508310 Aug 12 14:27 test-1.jar
-rw-r--r--. 1 root root 259655591 Aug 12 14:20 test.jar
drwxr-xr-x. 3 root root 4096 Aug 8 15:17 META-INF
drwxr-xr-x. 3 root root 4096 Feb 1 1980 org
方式四:解压jar直接运行
其实在springboot的官网介绍中,提供了多种的运行方式,其中有一条就是 jar
解压运行,运行方式如下:
$ java org.springframework.boot.loader.JarLauncher
如果需要传递命令参数的话,则可以使用如下方式:
$ java org.springframework.boot.loader.JarLauncher --server.port=10086
org.springframework.boot.loader.JarLauncher
是程序的主入口,这个全类名还是比较长的,如果不记得的话可以查看 META-INF/MANIFEST.MF
文件中的 Main-Class
属性值。
$ cat META-INF/MANIFEST.MF | grep "Main-Class"
Main-Class: org.springframework.boot.loader.JarLauncher
其他的可以参考“方式三”中的方式:对 jar
文件进行解压缩,并替换要修改的目标文件,随后直接运行。