系列中的上一篇
当前教程
Jar - 归档工具
系列中的下一篇

系列中的上一篇: Jshell - Java Shell 工具

系列中的下一篇: Jlink - 组装和优化一组模块

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.classBar.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 日


系列中的上一篇
当前教程
Jar - 归档工具
系列中的下一篇

系列中的上一篇: Jshell - Java Shell 工具

系列中的下一篇: Jlink - 组装和优化一组模块