jar命令:linux中对jar文件的操作

本文介绍了Linux系统中如何使用jar命令来创建、更新和提取jar文件的内容,包括如何使用manifest文件、模块化jar以及如何替换和修改jar内的文件。通过示例展示了如何执行这些操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在 Linux 中,您可以使用 jar 命令来对 jar 文件中的文件进行编辑。jar 命令是 Java Development Kit (JDK) 中的一部分,用于创建、查看和修改 jar 文件。

先看一下jar自带的帮助文档

─$ jar --help                                                                                                                                                                                                                      127 ↵
用法: jar [OPTION...] [ [--release VERSION] [-C dir] files] ...
jar 创建类和资源的档案, 并且可以处理档案中的
单个类或资源或者从档案中还原单个类或资源。

 示例:
 # 创建包含两个类文件的名为 classes.jar 的档案:
 jar --create --file classes.jar Foo.class Bar.class
 # 使用现有的清单创建档案, 其中包含 foo/ 中的所有文件:
 jar --create --file classes.jar --manifest mymanifest -C foo/ .
 # 创建模块化 jar 档案, 其中模块描述符位于
 # classes/module-info.class:
 jar --create --file foo.jar --main-class com.foo.Main --module-version 1.0
     -C foo/ classes resources
 # 将现有的非模块化 jar 更新为模块化 jar:
 jar --update --file foo.jar --main-class com.foo.Main --module-version 1.0
     -C foo/ module-info.class
 # 创建包含多个发行版的 jar, 并将一些文件放在 META-INF/versions/9 目录中:
 jar --create --file mr.jar -C foo classes --release 9 -C foo9 classes

要缩短或简化 jar 命令, 可以在单独的文本文件中指定参数,
并使用 @ 符号作为前缀将此文件传递给 jar 命令。

 示例:
 # 从文件 classes.list 读取附加选项和类文件列表
 jar --create --file my.jar @classes.list


 主操作模式:

  -c, --create               创建档案。通过 -f 或 --file 指定的档案文件名
                             包含路径时,还将创建
                             缺少的父目录
  -i, --generate-index=FILE  为指定的 jar 档案生成
                             索引信息
  -t, --list                 列出档案的目录
  -u, --update               更新现有 jar 档案
  -x, --extract              从档案中提取指定的 (或全部) 文件
  -d, --describe-module      输出模块描述符或自动模块名称
      --validate             验证 jar 档案的内容。此选项
                             将验证由多发行版 jar 档案导出
                             的 API 在所有不同的发行版本中
                             是否一致。

 在任意模式下有效的操作修饰符:

  -C DIR                     更改为指定的目录并包含
                             以下文件
  -f, --file=FILE            档案文件名。省略时, 基于操作
                             使用 stdin 或 stdout
      --release VERSION      将下面的所有文件都放在
                             jar 的版本化目录中 (即 META-INF/versions/VERSION/)
  -v, --verbose              在标准输出中生成详细输出

 在创建和更新模式下有效的操作修饰符:

  -e, --main-class=CLASSNAME 捆绑到模块化或可执行
                             jar 档案的独立应用程序
                             的应用程序入口点
  -m, --manifest=FILE        包含指定清单文件中的
                             清单信息
  -M, --no-manifest          不为条目创建清单文件
      --module-version=VERSION    创建模块化 jar 或更新
                             非模块化 jar 时的模块版本
      --hash-modules=PATTERN 计算和记录模块的散列,
                             这些模块按指定模式匹配并直接或
                             间接依赖于所创建的模块化 jar 或
                             所更新的非模块化 jar
  -p, --module-path          模块被依赖对象的位置, 用于生成
                             散列

 只在创建, 更新和生成索引模式下有效的操作修饰符:

  -0, --no-compress          仅存储; 不使用 ZIP 压缩
      --date=TIMESTAMP       具有可选时区的 ISO-8601 扩展偏移
                             日期时间格式的时间戳(用于条目的时间戳),
                             例如,"2022-02-12T12:30:00-05:00"

 其他选项:

  -?, -h, --help[:compat]    提供此帮助,也可以选择性地提供兼容性帮助
      --help-extra           提供额外选项的帮助
      --version              输出程序版本

 如果模块描述符 'module-info.class' 位于指定目录的
 根目录中, 或者位于 jar 档案本身的根目录中, 则
 该档案是一个模块化 jar。以下操作只在创建模块化 jar,
 或更新现有的非模块化 jar 时有效: '--module-version',
 '--hash-modules' 和 '--module-path'。

 如果为长选项提供了必需参数或可选参数, 则它们对于
 任何对应的短选项也是必需或可选的。
 
 cheat:jar
---
syntax: bash
tags: [ java ]
---
# To archive all files in the current directory into a jar file:
jar cf <file.jar> *

# To create a jar file using a pre-existing manifest file:
jar cfm <file.jar> <manifest_file> *

# To extract all files from a jar file in the current directory:
jar xf <file.jar>

# To extract only certain files from a jar file:
jar xf <file.jar> <file_to_extract>

# To list the content of a jar file:
jar tf <file.jar>

# To list the content of a jar file with verbose output:
jar tf <file.jar>

 tldr:jar
# jar
# Java applications/libraries packager.
# More information: <https://docs.oracle.com/javase/tutorial/deployment/jar/basicsindex.html>.

# Recursively archive all files in the current directory into a .jar file:
jar cf file.jar *

# Unzip .jar/.war file to the current directory:
jar -xvf file.jar

# List a .jar/.war file content:
jar tf path/to/file.jar

# List a .jar/.war file content with verbose output:
jar tvf path/to/file.jar

linux中,替换jar包中的文件,可以减少重新打包上传的时间,尤其是网速不好的时候。

根据文件名,查找出文件在jar包中的文件目录位置;

╰─$ jar -tvf dispatch-analysis-web-2.0.0.0.jar | grep FocusEnterpriseMapper.xml

>   651 Tue Jun 20 16:04:26 CST 2023 BOOT-INF/classes/com/ehl/utb/analysis/db/xml/FocusEnterpriseMapper.xml

将需要修改的文件,解压出来,并替换修改的文件;

jar -xvf dispatch-analysis-web-2.0.0.0.jar BOOT-INF/classes/com/ehl/utb/analysis/db/xml/FocusEnterpriseMapper.xml

解压完之后,在当前文件夹中,就会有对应的目录文件:

BOOT-INF/classes/com/ehl/utb/analysis/db/xml/FocusEnterpriseMapper.xml

根据上面的解压目录找到FocusEnterpriseMapper.xml,然后把我们需要更换的这个文件放进去,覆盖之前的文件即可。

之后开始把更新后的文件放入jar中。压缩修改完的文件;

╰─$ jar -uvf dispatch-analysis-web-2.0.0.0.jar BOOT-INF/classes/com/ehl/utb/analysis/db/xml/FocusEnterpriseMapper.xml

文件放入成功,这个时候,重启项目即可。

替换jar包中的jar文件时,前2个步骤同上,最后一步略有不同。

╰─$ jar -uvf0 abc.jar BOOT-INF/lib/a.jar

使用的是-uvf0而是不是-uvf

参考:linux中对jar文件的操作,Linux如何修改jar里的文件,linux替换jar包文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sajor_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值