1.书写背景

相信大家都碰到过项目发包,因为某种小问题需要重新发包,但是这种改动非常小,网络不好的情况下发包啥的相当耗时,特别是网络不好,包又特别大的时候,那就更加难受了,我想着要是直接替换jar包里面的某个文件那不是,省时省力,于是查阅了一下资料,果真可以完美替换。

2.命令介绍

jar命令格式:jar {c t x u f }[ v m e 0 M i ][-C 目录]文件名…

其中{ctxu}这四个参数必须选选其一。[v f m e 0 M i ]是可选参数,文件名也是必须的。

-c 创建一个jar包
-t 显示jar中的内容列表
-x 解压jar包
-u 添加文件到jar包中
-f 指定jar包的文件名
-v 生成详细的报造,并输出至标准设备
-m 指定manifest.mf文件.(manifest.mf文件中可以对jar包及其中的内容作一些一设置)
-0 产生jar包时不对其中的内容进行压缩处理
-M 不产生所有文件的清单文件(Manifest.mf)。这个参数与忽略掉-m参数的设置
-i 为指定的jar文件创建索引文件
-C 表示转到相应的目录下执行jar命令,相当于cd到那个目录,然后不带-C执行jar命令

3.操作步骤

步骤如下:

如果要替换的文件在jar包的二级及以下目录下,则需要以下步骤:

(1)使用jar tvf jar名称 | grep 目标文件名 查询出目标文件在war包中的目录

(2)使用jar xvf jar名称 目标文件名(copy上面查出的全路径) 将目标文件及所在war包中的目录解压到当前路径

(3)修改目标文件的内容,或者将要新的目标文件替换掉提取出来的目标文件

(4)使用jar uvf jar名称 目标文件名(和步骤(2)中的目标文件名相同) 将新目标文件替换到 jar包中

4.操作命令

例如:我的项目文件在/opt/project文件夹下面
在这里插入图片描述

  1. 查找目标文件
[root@instance-n4r06itt project]# jar tvf faw-ca-api-1.0.jar | grep OpenSSLService.class
  3563 Wed Jan 15 10:33:18 CST 2020 BOOT-INF/classes/com/faw/ca/api/service/OpenSSLService.class
  1. 解压目标文件
[root@instance-n4r06itt project]# jar -xvf faw-ca-api-1.0.jar BOOT-INF/classes/com/faw/ca/api/service/OpenSSLService.class
 inflated: BOOT-INF/classes/com/faw/ca/api/service/OpenSSLService.class
[root@instance-n4r06itt project]# ll
total 98240
drwxr-xr-x 3 root root      4096 Mar  9 20:05 BOOT-INF
-rw-r--r-- 1 root root 100585648 Mar  9 20:02 faw-ca-api-1.0.jar
  1. 覆盖文件到指定文件夹
[root@instance-n4r06itt project]# cp OpenSSLService.class BOOT-INF/classes/com/faw/ca/api/service/
cp: overwrite ‘BOOT-INF/classes/com/faw/ca/api/service/OpenSSLService.class’? Y
  1. 按照路径覆盖到jar包
[root@instance-n4r06itt project]# jar -uvf faw-ca-api-1.0.jar BOOT-INF/classes/com/faw/ca/api/service/OpenSSLService.class
adding: BOOT-INF/classes/com/faw/ca/api/service/OpenSSLService.class(in = 3960) (out= 1548)(deflated 60%)

5.验证结果

将jar包拷贝到本地进行验证,打开jar包的工具用jd-jui就行。

替换之前代码

在这里插入图片描述替换之后代码:

在这里插入图片描述
以后碰到这种小改动就省事多了,哈哈。

参考资源:
jar命令的用法详解
linux_直接在linux里面替换jar包里的某个文件

Logo

更多推荐