Jar - 归档工具
介绍 jar
jar - 创建类和资源的归档文件,并可以从归档文件中操作或恢复单个类或资源。jar 命令是一个通用归档和压缩工具,基于 ZIP 和 ZLIB 压缩格式。
概要
jar [OPTION...] [ [--release VERSION] [-C dir] files] ...
描述
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 文件时,创建和更新模式中有效的操作修饰符中描述的以下操作仅有效。
--module-version
--hash-modules
--module-path
主要操作模式
使用 jar 命令时,您必须指定它要执行的操作。您通过在命令行中包含本节中描述的适当操作参数来指定 jar 命令的操作模式。您可以将操作参数与其他单字母选项混合使用。通常,操作参数是在命令行上指定的第一个参数。
-c
或 --create
创建归档文件。
-i=FILE
或 --generate-index=FILE
为指定的 JAR 文件生成索引信息。
-t
或 --list
列出归档文件的目录表。
-u
或 --update
更新现有的 JAR 文件。
-x
或 --extract
从归档文件中提取指定(或所有)文件。
-d
或 --describe-module
打印模块描述符或自动模块名称。
在任何模式下有效的操作修饰符
您可以使用以下选项来自定义 jar 命令中包含的任何操作模式的操作。
-C directory
更改指定的目录并包含在命令行末尾指定的 files
jar [OPTION...] [ [--release VERSION] [-C dir] files]
-f=FILE
或 --file=FILE
指定归档文件名。
--release VERSION
创建多版本 JAR 文件。将选项后指定的所有文件放置到 JAR 文件的版本化目录中,名为 META-INF/versions/VERSION/
,其中 VERSION 必须是大于或等于 9 的正整数。
在运行时,如果 JAR 文件中存在多个版本的类,JDK 将使用它找到的第一个类,首先在 VERSION 号码与 JDK 主要版本号匹配的目录树中搜索。然后,它将在具有较低 VERSION
号码的目录中查找,最后在 JAR 文件的根目录中查找。
-v
或 --verbose
将详细输出发送到标准输出或打印到标准输出。
仅在创建和更新模式下有效的操作修饰符
您可以使用以下选项来自定义创建和更新主要操作模式的操作。
-e=CLASSNAME
或 --main-class=CLASSNAME
指定捆绑到模块化或可执行模块化 JAR 文件中的独立应用程序的应用程序入口点。
-m=FILE
或 --manifest=FILE
包含来自给定清单文件的清单信息。
-M
或 --no-manifest
不为条目创建清单文件。
--module-version=VERSION
在创建或更新模块化 JAR 文件或更新非模块化 JAR 文件时,指定模块版本。
--hash-modules=PATTERN
计算并记录与给定模式匹配的模块的哈希值,这些模块直接或间接依赖于正在创建的模块化 JAR 文件或正在更新的非模块化 JAR 文件。
-p
path 或 --module-path path
指定用于生成哈希值的模块依赖项的位置。
@file
从文本文件中读取 jar 选项和文件名。
仅在创建、更新和生成索引模式下有效的操作修饰符
您可以使用以下选项来自定义创建 (-c
或 --create
) 更新 (-u
或 --update
) 和生成索引 (-i
或 --generate-index=FILE
) 主要操作模式的操作。
-0
或 --no-compress
存储时不使用 ZIP 压缩。
其他选项
以下选项被 jar 命令识别,并且不与操作模式一起使用。
-h
或 --help[:compat]
显示 jar 命令的命令行帮助,或者可选地显示兼容性帮助。
--help-extra
显示有关额外选项的帮助。
--version
打印程序版本。
jar 命令语法示例
jar 命令语法示例
创建一个包含两个类文件 Foo.class
和 Bar.class
的归档文件 classes.jar
。
jar --create --file classes.jar Foo.class Bar.class
使用现有的清单文件 mymanifest
创建一个归档文件 classes.jar
,该清单文件包含目录 foo/ 中的所有文件。
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-16 目录中的文件放置在 JAR 文件的 META-INF/versions/16
目录中。在此示例中,classes/com/foo
目录包含两个类,com.foo.Hello
(入口点类)和 com.foo.NameProvider
,两者都针对 JDK 8 编译。classes-16/com/foo
目录包含 com.foo.NameProvider
类的不同版本,此版本包含 JDK 16 特定的代码,并针对 JDK 16 编译。
给定此设置,通过从包含 classes 和 classes-16
目录的目录运行以下命令来创建多版本 JAR 文件 foo.jar。
jar --create --file foo.jar --main-class com.foo.Hello -C classes . --release 16 -C classes-16 .
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/16/com/
META-INF/versions/16/com/foo/
META-INF/versions/16/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 16 运行程序将确保 com.foo.NameProvider
类是 META-INF/versions/16/com/foo/
中的类。使用 JDK 8 运行程序将确保 com.foo.NameProvider
类是 JAR 文件根目录中的类,位于 com/foo
中。
通过从文件 classes.list 读取选项和类文件列表来创建一个归档文件 my.jar
。
jar --create --file my.jar @classes.list
上次更新: 2021 年 9 月 14 日