名称
jar - 为类和资源创建存档,并从存档中操作或恢复单个类或资源
概要
jar
[选项 ...] [ [--release
版本] [-C
目录] 文件] ...
描述
jar
命令是一个通用的归档和压缩工具,基于 ZIP 和 ZLIB 压缩格式。最初,jar
命令设计用于打包 Java 小程序(自 JDK 11 起不再支持)或应用程序;然而,从 JDK 9 开始,用户可以使用 jar
命令创建模块化 JAR。为了传输和部署,通常更方便将模块打包为模块化 JAR。
jar
命令的语法类似于 tar
命令的语法。它有几种主要操作模式,由其中一个必需的操作参数定义。其他参数要么是修改操作行为的选项,要么是执行操作所必需的。
当模块或应用程序的组件(文件、图像和声音)合并到单个存档中时,它们可以通过 Java 代理(如浏览器)在单个 HTTP 事务中下载,而不需要为每个部分建立新连接。这显著提高了下载速度。jar
命令还会压缩文件,进一步提高下载速度。jar
命令还可以使文件中的单个条目签名,以便验证它们的来源。无论是否压缩,JAR 文件都可以用作类路径条目。
当您在给定目录的根目录或 .jar
存档的根目录中包含模块描述符 module-info.class
时,存档将成为模块化 JAR。在创建或更新模块化 JAR 或更新现有非模块化 JAR 时,下面描述的操作(仅在创建和更新模式中有效的操作修饰符)仅在创建或更新模块化 JAR 或更新现有非模块化 JAR 时有效:
-
--module-version
-
--hash-modules
-
--module-path
注意:
所有长选项的必需或可选参数对于任何相应的短选项也是必需或可选的。
主要操作模式
在使用 jar
命令时,您必须指定要执行的操作。通过包含本节中描述的适当操作参数,您可以为 jar
命令指定操作模式。您可以将操作参数与其他单字母选项混合使用。通常,操作参数是在命令行上指定的第一个参数。
-
-c
或--create
- 创建存档。
-
-i
文件 或--generate-index=
文件 - 为指定的 JAR 文件生成索引信息。此选项已被弃用,可能会在将来的版本中删除。
-
-t
或--list
- 列出存档的内容表。
-
-u
或--update
- 更新现有的 JAR 文件。
-
-x
或--extract
- 从存档中提取指定(或所有)文件。
-
-d
或--describe-module
- 打印模块描述符或自动模块名称。
任何模式中有效的操作修饰符
您可以使用以下选项自定义包含在 jar
命令中的任何操作模式的操作。
-
-C
目录 -
更改指定的目录,并在命令行末尾包含指定的 文件。
jar
[选项 ...] [ [--release
版本] [-C
dir] files] -
-f
文件 或--file=
文件 - 指定存档文件名。
-
--release
版本 -
创建多版本 JAR 文件。将选项后指定的所有文件放入名为
META-INF/versions/
版本/
的 JAR 文件的版本化目录中,其中 版本 必须是大于等于 9 的正整数值。在运行时,如果 JAR 中存在一个类的多个版本,则 JDK 将使用它找到的第一个版本,首先在其 版本 数与 JDK 的主版本号匹配的目录树中搜索。然后将查找具有逐渐较低 版本 数的目录,最后查找 JAR 的根目录。
-
-v
或--verbose
- 将详细输出发送或打印到标准输出。
仅在创建和更新模式中有效的操作修饰符
您可以使用以下选项自定义创建和更新主操作模式的操作:
-
-e
类名 或--main-class=
类名 - 指定独立应用程序的应用程序入口点,该应用程序捆绑到模块化或可执行的模块化 JAR 文件中。
-
-m
文件 或--manifest=
文件 - 包含给定清单文件中的清单信息。
-
-M
或--no-manifest
- 不为条目创建清单文件。
-
--module-version=
版本 - 在创建或更新模块化 JAR 文件或更新非模块化 JAR 文件时指定模块版本。
-
--hash-modules=
模式 - 计算并记录与正在创建的模块化 JAR 文件或正在更新的非模块化 JAR 文件直接或间接依赖的模块的哈希值。
-
-p
或--module-path
- 指定生成哈希的模块依赖项的位置。
-
@
文件 -
从文本文件中读取
jar
选项和文件名。
仅在创建、更新和生成索引模式中有效的操作修饰符
您可以使用以下选项自定义创建(-c
或 --create
)、更新(-u
或 --update
)和生成索引(-i
或 --generate-index=
文件)主操作模式的操作:
-
-0
或--no-compress
- 存储时不使用 ZIP 压缩。
-
--date=
时间戳 - 使用 ISO-8601 扩展偏移日期时间格式(可选时区)的时间戳,用于条目的时间戳,例如 "2022-02-12T12:30:00-05:00"。
其他选项
jar
命令识别以下选项,这些选项不与操作模式一起使用:
-
-h
或--help
[:compat
] -
显示
jar
命令的命令行帮助,或者可选地显示兼容性帮助。 -
--help-extra
- 显示额外选项的帮助。
-
--version
- 打印程序版本。
jar 命令语法示例
-
创建一个包含两个类文件
Foo.class
和Bar.class
的存档classes.jar
。jar --create --file classes.jar Foo.class Bar.class
-
创建一个包含两个类文件
Foo.class
和Bar.class
的存档classes.jar
,并将最后修改日期和时间设置为2021年1月6日 12:36:00
。jar --create --date="2021-01-06T14:36:00+02:00" --file=classes.jar Foo.class Bar.class
-
通过使用现有清单
mymanifest
创建一个包含目录foo/
中所有文件的存档classes.jar
。jar --create --file classes.jar --manifest mymanifest -C foo/
-
创建一个模块化 JAR 存档
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
foo.jar
更新为模块化 JAR 文件。jar --update --file foo.jar --main-class com.foo.Main --module-version 1.0 -C foo/module-info.class
-
创建一个带有版本或多版本的 JAR 存档
foo.jar
,将classes
目录中的文件放在 JAR 的根目录,将classes-10
目录中的文件放在 JAR 的META-INF/versions/10
目录。在这个例子中,
classes/com/foo
目录包含两个类com.foo.Hello
(入口点类)和com.foo.NameProvider
,都是为 JDK 8 编译的。classes-10/com/foo
目录包含一个不同版本的com.foo.NameProvider
类,这个版本包含 JDK 10 特定代码并为 JDK 10 编译。在这种设置下,通过从包含目录
classes
和classes-10
的目录运行以下命令,创建一个多版本 JAR 文件foo.jar
。jar --create --file foo.jar --main-class com.foo.Hello -C classes . --release 10 -C classes-10 .
JAR 文件
foo.jar
现在包含:% jar -tf foo.jar META-INF/ META-INF/MANIFEST.MF com/ com/foo/ com/foo/Hello.class com/foo/NameProvider.class META-INF/versions/10/com/ META-INF/versions/10/com/foo/ META-INF/versions/10/com/foo/NameProvider.class
除其他信息外,文件
META-INF/MANIFEST.MF
将包含以下行,指示这是一个带有入口点为com.foo.Hello
的多版本 JAR 文件。... Main-Class: com.foo.Hello Multi-Release: true
假设
com.foo.Hello
类调用com.foo.NameProvider
类的方法,使用 JDK 10 运行程序将确保com.foo.NameProvider
类是位于META-INF/versions/10/com/foo/
中的类。使用 JDK 8 运行程序将确保com.foo.NameProvider
类是位于 JAR 的根目录com/foo
中的类。 -
通过从文件
classes.list
读取选项和类文件列表,创建一个存档my.jar
。注意:
为了缩短或简化
jar
命令,您可以在一个单独的文本文件中指定参数,并使用 at 符号(@
)作为前缀将其传递给jar
命令。jar --create --file my.jar @classes.list