spring boot打包后的运行文件快速部署

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 文件进行解压缩,并替换要修改的目标文件,随后直接运行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值