JAR (文件格式)

在软件领域，JAR文件（Java归档，）是一种软件包文件格式，通常用于聚合大量的Java类文件、相关的元数据和资源（文本、图片等）文件到一个文件，以便分发Java平台应用软件或库。

JAR文件是一种归档文件，以ZIP格式构建，以.jar为文件扩展名。用户可以使用JDK自带的jar命令创建或提取JAR文件。也可以使用其他zip压缩工具，不过压缩时zip文件头里的条目顺序很重要，因为Manifest文件常需放在首位。JAR文件内的文件名是Unicode文本。

设计 

一个JAR文件允许Java运行时高效地部署一组类和它们相关的资源。JAR文件中的元素可以被压缩，这样一来，在单个请求中下载整个应用程序，使得下载一个JAR文件比对构成一个Java应用的许多未压缩的文件单独下载更方便。包java.util.zip包含读写JAR文件的类。 

JAR文件在路径META-INF/MANIFEST.MF下有一个可选的Manifest文件。Manifest文件中的条目定义这个JAR文件如何被使用。例如，类路径条目由其他JAR文件的绝对或相对路径的列表组成，用于指定在加载本JAR文件时同时加载的其他JAR文件。虽然旨在简化JAR的使用，但在实践中证明Manifest文件是非常脆弱的，因为入口点JAR在创建时依赖于所有相关的JAR的确切位置。一旦需要更改版本或库的位置，必需重建Manifest文件。

为了提取JAR文件的内容，用户可以使用任何标准的unzip解压缩软件，或者每个Java虚拟机都带有的jar命令：“jar -xf foo.jar”。

开发者可以对JAR文件进行数字签名。在这种情况下，签名信息成为嵌入的Manifest文件的一部分。JAR本身并没有被签名，而是归档内的每一个文件的校验和连同其名字作为签名，被记录在Manifest文件中。多个实体可能签署一个JAR文件，并在每次签名时改变这个JAR文件，虽然签署文件本身仍然有效。当Java运行时加载签名的JAR文件时，它可以验证签名并拒绝加载签名不匹配的类。Java运行时也支持“密封”的包（Sealed Packages）。类加载器一旦成功装载密封包中的某个类后，其后加载的类必须是由同一实体签名，才被允许加载到同一个包。这可以防止恶意代码被插入到现有的软件包，以至于接触到包范围内的类和数据。

开发者可以对JAR文件进行混淆，这样该JAR文件的用户无法得到关于该JAR文件所包含的代码的太多信息，并且能够压缩文件大小。这在空间受限的嵌入式系统开发中很有用。

可执行JAR文件 
一个可执行Java程序以及其使用的库文件可以打包在一个JAR文件中。

可执行的JAR文件中的Manifest文件用代码Main-Class: myPrograms.MyClass指定了入口点类，注意要指明该类的路径（-cp参数将被忽略）。有些操作系统可以在点击后直接运行可执行JAR文件。而更典型的调用则是通过命令行执行“java -jar foo.jar”。

在多数平台上可以使用封装器封装可执行JAR文件。例如，对于更喜欢使用Windows EXE的Microsoft Windows用户而言，可以使用工具（如、、、Nullsoft脚本安装系统等），将单个JAR文件转换为可执行文件。

Manifest 

在Java平台中, Manifest文件是JAR归档中所包含的特殊文件。Manifest文件被用来定义扩展或档案打包相关数据。Manifest文件是一个元数据文件，它包含了不同部分中的数据。如果一个JAR文件被当作可执行文件，则其中的Manifest文件需要指出该程序的主类文件。通常Manifest文件的文件名为MANIFEST.MF。

通常Manifest文件都与Java档案相关，其他的情况比较少见。

Apache Ant的Zip/JAR支持 
在Apache Ant构建工具中有其自己的包——org.apache.tools.zip，用来读写Zip和JAR归档文件，并包括对Unix文件系统的支持。org.apache.tools.zip包发布在Apache软件基金会许可下，并被设计成在Ant之外使用。

相关格式 
几种相关的文件格式建立在JAR格式的基础上：

 WAR （Web应用程序归档，)，也是一种Java归档，存储XML文件、Java类、JSP和Web应用程序中的其他文件。
 RAR（资源适配器归档，），这里不是指RAR文件格式），也是一种Java归档，存储XML文件、Java类和Java EE连接器架构（JCA）应用中的其他文件。
  （），是一种复合式Java归档文件，包含了XML文件、Java类和针对Java EE应用的其他Java归档文件，例如JAR、WAR和RAR。
 SAR（），与EAR类似。它提供了service.xml文件和相应的JAR文件。
 APK (Android应用程序包文件，）Java归档格式的一个变种，用于Android应用程序。

参见 

 JAR hell
 Open Packaging Conventions

参考文献

外部链接 
 JAR文件概览 
 JAR文件定义 
 JAR文件的初始定义 
 IBM developmentWorks：JAR文件揭密 

归档格式
Java平台