直接修改和替换Jar包中文件的几种方式

在我们日常打包部署 Jar 包的时候,时常会出现需要修改少量内容或替换某个文件的时候,重新打包完整 Jar 包并在网上传输费时费力,所以需要直接修改 Jar 包,这里就对直接修改 和替换 Jar 包中文件的几种方式做一下总结。

通用方法——解压后重新打包 Jar 包

这个通用方法,就是将 Jar 包进行解压,修改或替换文件后,重新打包成 Jar 包的方式。这个方法需要部署 JAVA jdk,需要用到其中的 jar 命令。

我们可以先看下 jar 命令的官方说明,0参数是关键。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
用法: 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/ .

所以流程就是这样的,首先解压 jar 包。

1
2
# 解压
jar -xvf test.jar

进入文件夹编辑或者替换需要更改的文件,然后重新进行打包,加了 0 参数表示只打包不压缩。

1
2
# 压缩
jar -cvf0m test.jar ./META-INF/MANIFEST.MF .

不要漏了这个 MANIFET.MF 文件,,这个文件里面记录了该 JAR 包的版本、创建人和类搜索路径等信息。如果一个 JAR 文件被当作可执行文件,则其中的 MANIFEST 文件需要指出该程序的主类文件,漏掉了则不能正常执行。

Windows 方式

在 Windows 上因为有许多完善好用的 GUI 应用,编辑起来就简单很多。Jar 包通常可以通过安装的压缩软件直接打开,所以至少要安装一个压缩软件,我想基本上每个人都会有的。

仅文本文件

对于文本文件来说,一般可以直接在 Jar 包里打开,修改保存后,压缩软件会提醒说文件已经修改,是否更新到 Jar 包中,点确定即可。

所有文件

所有文件,都可以通过将文件拖进 Jar 包的方式,添加或替换内容。需要注意的是,压缩方式需要选择存储/不压缩,或是其他类似的表达。当然也可以通过上面的通用方法解决。

Linux 方式

我指的 Linux 方式,基本就是指命令行的方式,不包含桌面操作,那个我不是很了解,或许会和 Windows 上的操作比较接近。

仅文本文件

首先需要系统里面安装 vim 和 zip 两个包,如果是 Ubuntu,可以运行sudo apt install vim zip -y安装。

然后你可能已经想到了,那就是通过 vim 工具打开 Jar 包,将会显示 Jar 包中的所有文件夹和文件绝对路径,每行显示一个。

通过将光标移动到需要修改的文件上,回车进入文件,像编辑普通文件一样进行修改,修改完成后,:wq退出返回到文件列表。

接下来可以选择继续编辑其他文件或退出 Jar 包。退出 Jar 包时,请一定要通过:q退出,这个很重要,如果你像上面保存文件一样加了 w 参数,这个 Jar 包就废了,它将会变成保存了文件列表的一个文本文件。所以请千万通过:q参数退出 Jar 包,切记!

所有文件

这个我暂时只知道通过上面说明的通用方法进行修改替换文件,如有小伙伴知道其他方法,希望可以告诉我,十分感谢。