原创 1024夜谭
jar文件即Java归档文件,也称为jar包,是Java应用软件或库,通常聚合了大量的Java类文件、相关的元数据和资源文件。通常由构建工具产生,可以使用IDE、反编译工具或者Java诊断工具如Arthas等查看内容。
如果你对tar命令使用得心应手,那么你将发现jar操作与tar操作有许多相似之处。通过这些操作,可以让一些与jar相关的事情变得简单,从而提高工作效率。如:查看、修改jar文件中的配置文件,或者删除有问题的资源。
查看jar文件中的内容
和使用tar命令查看归档文件内容一样,jar命令也有“tf”选项,可以查看jar包中的内容。例如,查看jar包中有哪些配置文件:
~$ jar tf app.jar |grep ^config
config/
config/application-dev.yml
config/application.yml
“^config”匹配以config开头的内容,这样可以列出jar包中config目录的文件。
提取jar文件中的内容
前面已经列出jar包中的配置文件,如果想查看配置文件中的具体内容,则需要从jar包中提取该配置文件到文件系统,然后就可以查看或者编辑文件内容。和tar命令一样,使用“xf”选项。例如,提取config/application.yml文件:
~$ jar xf app.jar config/application.yml
~$ ls config
application.yml
提取文件需要使用该文件在jar包中的完整路径。提取后的文件,将根据jar包中的文件路径,放置在当前目录下,对于路径中不存在的目录会自动创建。
更新jar文件中的内容
如果修改了config/application.yml文件的内容,需要将修改后的文件更新到jar包中。更新文件也是使用“uf”选项,如以下命令:
~$ jar uf app.jar config/application.yml
操作技巧:开启命令行vi选项,然后在命令行按Esc键,随后输入“/xf”或者“/jar xf”后回车,可以快速找到之前执行过的提取config/application.yml文件的命令,然后按w键,光标跳到“x”的位置,按r键进入编辑模式(替换),按u键将输入“u”替换“x”,即完成本例中的命令输入,按回车执行即可。效果如下图,详细了解可看文末的相关阅读:
删除jar文件中的内容
这一点与tar操作不一样。tar命令可以使用“--delete”选项,从tar文件中删除一个或多个文件。jar命令未提供从jar包中删除文件的选项,但可以通过已有选项实现该操作。
为了删除jar包中的文件,需要首先将jar包中的所有文件进行提取,随后将这些文件从文件系统中移除,再重新生成新的jar包。
例如,在处理log4j漏洞时,漏洞扫描工具检测到应用程序jar包中有log4j-api等log4j相关的jar包,但应用实际未使用log4j,是通过日志框架间接引入的。可以通过执行以下命令,生成不包含log4j相关jar包的应用程序新jar包:
~$ cp app.jar app.jar.bak
~$ jar xf app.jar
~$ rm app.jar BOOT-INF/lib/*log4j*
~$ jar cfm0 app.jar META-INF/MANIFEST.MF BOOT-INF/ org/
操作之前先备份现有的jar包!这是一个很重要的习惯,可以防止意外造成数据丢失。
依赖包在应用jar包中位于BOOT-INF/lib目录下,提取后的文件位于当前目录的BOOT-INF/lib中,将需要删除的文件从该目录移除。
jar命令的“cf”选项和tar命令的“cf”选项作用一样;“m”选项表示更新清单文件META-INF/MANIFEST.MF,这个文件是从jar包中提取出来的,不需要额外修改;“0”表示创建jar文件时不使用zip压缩。
总的来说,通过借鉴tar命令的使用方式,我们可以更轻松地处理jar文件。这些操作简化了与jar文件相关的任务,提高了工作效率。掌握一些常用的命令和工具,可以使我们的工作流程更加顺畅,让我们有更多的时间去专注于更重要的事情。