JAR文件格式
JAR(Java Archive)是基于ZIP文件格式的文件格式。
它用于捆绑Java应用程序或小程序的资源,类文件,声音文件,图像等。 它还提供数据压缩。一个JAR文件作为一种特殊类型的ZIP文件。可以对JAR文件的内容进行数字签名,以提供安全性。 它提供了一个平台无关的文件格式。
可以使用JAR API在Java程序中处理JAR文件。JAR文件可以具有可选的META-INF
目录,以包含包含应用程序配置信息的文件和目录。
META-INF目录
下表列出了META-INF
目录中的条目。
名称 | 类型 | 目的 |
---|---|---|
MANIFEST.MF | 文件 | 它包含扩展和包相关数据。 |
INDEX.LIST | 文件 | 它包含软件包的位置信息。 类加载器使用它来加快类搜索和加载过程。 |
X.SF | 文件 | X是基本文件名。 它存储jar文件的签名。 |
X.DSA | 文件 | X是基本文件名。 它存储相应签名文件的数字签名。 |
/services | 目录 | 此目录包含所有服务提供程序配置文件。 |
Jar工具
JDK提供了一个jar工具来创建和操作JAR文件。还可以使用java.util.jar
包中的类使用Java API创建和操作JAR文件。
JAR API有一些新类来处理清单文件。Manifest
类表示清单文件。要使用jar
工具创建JAR文件,许多命令行选项都可用。
以下代码列出了jar
工具的命令行选项。
选项 | 描述 |
---|---|
-c | 创建一个新的JAR文件。 |
-u | 更新现有的JAR文件。 |
-x | 从JAR文件中提取命名文件或所有文件。 |
-t | 列出JAR文件的目录。 |
-f | 指定JAR文件名。 |
-m | 包括来自指定文件的清单信息。 |
-M | 不要创建清单文件。 |
-i | 为指定的JAR文件生成索引信息。它在JAR文件中的META-INF 目录下创建一个INDEX.LIST 文件。 |
-0 | 不要压缩JAR文件中的条目。 只存储它们,选项值为零,表示零压缩。 |
-e | 将指定的类名添加为清单文件主要部分中Main-Class 条目的值。 |
-v | 在标准输出上生成详细输出 |
-C | 切换到指定的目录并在JAR文件中包括以下文件。 请注意,该选项为大写(C)。 小写字母(c)用于指示创建JAR文件选项。 |
创建JAR文件
使用以下命令创建一个带有两个名为A.class
和B.class
类的JAR类型文件的test.jar
:
jar cf test.jar A.class B.class
在上面的命令中,选项c
表示创建一个新的JAR文件,选项f
表示指定一个JAR文件名,这里是:test.jar
。
在命令结束时,可以指定要包括在JAR文件中的一个或多个文件名或目录名。要查看test.jar
文件的内容,请执行以下命令:
jar tf test.jar
选项t
表示对JAR文件的目录感兴趣。选项f
表示指定了JAR文件名,在这个示例中是test.jar
。
上述命令将生成以下输出:
META-INF/
META-INF/MANIFEST.MF A.class
B.class
jar命令自动在META-INF
目录中创建了两个额外的东西:一个名为META-INF
的目录和一个名为MANIFEST.MF
的文件。
以下命令将通过在当前工作目录中包含所有内容来创建test.jar
文件。
jar cf test.jar *
以下命令将创建一个JAR文件,其中包含book/archives
目录中的所有类文件以及book/images
目录中的所有图片。
jar cf test.jar book/archives/*.class book/images
可以在创建JAR文件时使用命令行选项指定清单文件。Manifest
文件是一个文本文件,其中包含JAR文件的所有列表条目。Manifest
文件必须在文件末尾有一个空行。 否则,将不处理列表文件中的最后一个条目。
以下命令将在创建test.jar
文件(包括当前目录中的所有文件和子目录)时使用manifest.txt
文件。
上述命令中使用的选项的顺序很重要。 f
出现在m
之前,必须在Manifest
文件名manifest.txt
之前指定JAR文件名test.jar
。
可以按如下方式重写上述命令:
jar cmf manifest.txt test.jar *
更新JAR文件
使用选项u
更新现有的JAR文件条目或其Manifest
文件。以下命令将向现有的test.jar
文件添加一个C.class
文件:
jar uf test.jar C.class
假设有一个test.jar
文件,并且要将它的Manifest
文件中的Main-Class
条目更改为HelloWorld
类。可以使用以下命令:
jar ufe test.jar HelloWorld
在此命令中,选项u
表示正在更新JAR
文件 选项f
指示指定JAR
文件名,即test.jar
,选项e
表示在test.jar
文件中为MANIFEST.MF
文件指定Main-Class
条目的值为HelloWorld
。
索引JAR文件
可以为JAR文件生成一个索引文件。 它用于加快类加载。在创建JAR文件后,必须在单独的命令中使用选项i
和jar
命令。
jar i test.jar
此命令将向test.jar
文件添加一个META-INF/INDEX.LIST
文件。可以通过使用以下命令列出test.jar
文件的目录来验证它:
jar tf test.jar
提取JAR文件
要从JAR文件中提取所有或部分条目,请使用选项x
和jar
命令。从test.jar
文件中提取所有条目如下 -
jar xf test.jar
选项x
是从JAR文件中提取条目。选项f
指定文件名,在这个示例中它是test.jar
。
上述命令将从当前工作目录中的test.jar
文件中提取所有条目。它将创建与test.jar
文件中存在的相同的目录结构。要从JAR文件中提取单个条目,请在命令结尾处列出它们。 条目应该用空格分隔。
以下命令将从test.jar
文件中提取A.class
和book/HelloWorld.class
条目:
jar xf test.jar A.class book/HelloWorld.class
要从book
目录中提取所有类文件,可以使用以下命令:
jar xf test.jar book/*.class
列表JAR文件内容
使用选项t
与jar
命令来列出标准输出上的JAR文件的目录。
jar tf test.jar