01 引言
有时候,我们需要在线上把某个jar包里面的某一个class文件替换,一般需要重新打包。
其实jdk里面自带了工具类,无需重新打包,使用命令就可以进行jar包里面的文件替换了。这个工具类的名称为“jar
”,本文来讲讲。
02 操作演示
举例:替换flink-connector-jdbc_2.11-1.13.6.jar包里面的JdbcDynamicTableFactory.class文件。
工具:jdk
安装包里面bin
目录下的jar
首先查询我们要替换的jar文件所处用于jar包的位置,命令如下:
jar -tvf flink-connector-jdbc_2.11-1.13.6.jar |grep JdbcDynamicTableFactory
解压路径的文件到本地:
jar -xvf flink-connector-jdbc_2.11-1.13.6.jar org/apache/flink/connector/jdbc/table/JdbcDynamicTableFactory.class
使用cp或者mv命令替换解压出来目录的文件class文件:
cp JdbcDynamicTableFactory.class org/apache/flink/connector/jdbc/table/JdbcDynamicTableFactory.class
替换成功之后,再把它压缩回去:
jar -uvf flink-connector-jdbc_2.11-1.13.6.jar org/apache/flink/connector/jdbc/table/JdbcDynamicTableFactory.class
ok,就这样我们就做到使用jar命令来替换jar包里面的class文件了。
03 命令总结
从上述的实操中,可以知道有几个命令:
① 查询替换文件的路径:
jar -tvf jar包名称 |grep 替换的文件名
② 解压需要替换的文件到当前目录:
jar -xvf jar包名称 文件在jar包中的全路径名
③压缩修改的文件:
jar -uvf jar包名称 文件在jar包中的全路径名
更为详细的用法,使用“jar --help
”命令查看:
$ jar --help 非法选项: - 用法: 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/ .
04 文末
本文主要讲解了如何替换jar包中的文件,希望能帮助到大家,谢谢大家的阅读,本文完!