前言
项目中都会打包成 jar 文件,然后上传服务器运行。往往一个项目或大模块打包成一个jar包,而我们有时候我们因为各种情况:需要更新其中的一个或几个文件
- 修改配置文件、静态文件
- 修改 jar 包,class 文件
- 网不好,jar 文件太大。
- 等等 and so on
不想因为一点简单的操作完成 源码 -> 编译 -> 打包 -> 上传 等流程。
我们可以对 jar 包进行增量更新。(网上那种改 zip 再改 jar 的,你动手试验一下啊,被你们骗的好惨)
另外想根本上实现小的项目jar包,可以修改Maven项目打包方式,可以参考我最新文章《基于spring-boot-maven-plugin插件打包lib文件外置,layout模式为ZIP模式》
现有的工具
使用 jdk 提供的现有工具 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/ .
操作
准备 jdk 环境, 增量更新直接查看更新 jar 包
解压 jar 包
jar -xvf [jar包名称]
命令解压 jar 包
其实增量时,就是我们保持这样解压出来的的文件结构
,使用增量更新命令对目标 jar 进行更新就可以了。
增量更新 jar 包
jar -uvf0 [jar包名称] [文件夹绝对路径]
-u 更新现有档案
-v 在标准输出中生成详细输出
-f 指定档案文件名
-0 仅存储; 不使用任何 ZIP 压缩
如下结构,我就以一个 application.yml 文件进行增量更新 jar 包为例
└─test
│ xxx.jar
│
└─BOOT-INF
└─classes
application.yml
在jar包目录执行增量更新命令进行增量更新,这样 jar 包中的文件就被我们替换为同级目录文件中的文件。
jar -uvf0 xxx.jar BOOT-INF
详情如下图所示:
jar 包内被更新
总结
- 使用命令解压 xxx.jar 包,命令:jar -xvf xxx.jar;
- 与解压后的目录保持一致上传增量文件;
- 使用 jar -uvf0 命令将指定文件更新到 xxx.jar 里面,重启即可
祝大家玩的愉快!!!