关于JAR文件不可不知的一点事情

关于JAR文件不可不知的一点事情

JAR文件是在java研发中一个最常用,但是经常被忽略的结构。我们的代码产出很多都会被编译为class文件,并打包为jar包,但是除了class文件,jar包还有哪些结构特征呢?META-INF目录?service目录?MANIFEST.MF文件等等?让我们来系统的挖掘下jar文件的结构以及其设计理念和功能规格等。

关于JAR文件的最准确材料与介绍在哪里?JAVA官方网站。

我们来看这两个资料,一个是比较早的JAVA8版本的JAR文件规范,一个是最新的JAVA18版本的JAR文件规范。

Packaging Programs in JAR FilesJAVA8

JAR File SpecificationJAVA8JAVA18

我们把其中的常用知识来稍微展开一下吧。

一、使用JAR文件:基础知识

JAR文件以ZIP文件格式打包,因此您可以将它们用于无损数据压缩、归档、解压缩和归档解包等任务。这些任务是JAR文件最常见的用途之一,仅使用这些基本特性就可以实现许多JAR文件的好处。

即使您想利用JAR文件格式提供的高级功能(如电子签名),也需要首先熟悉基本操作。

要使用JAR文件执行基本任务,可以使用Java开发工具包(JDK)中提供的java归档工具。因为Java归档工具是通过使用jar命令,本教程将其称为“Jar工具”。

作为本节将要介绍的一些主题的概要和预览,下表总结了常见的JAR文件操作:

操作命令
创建JAR文件jar cf jar-file input-file(s)
查看JAR文件的内容jar tf jar-file
提取JAR文件的内容jar xf jar-file
从JAR文件中提取特定文件jar xf jar-file archived-file(s)
要运行打包为JAR文件的应用程序(需要Main-class 文件头)java -jar app.jar
调用打包为JAR文件的applet<applet code=AppletClassName.class archive=”JarFileName.jar” width=width height=height> </applet>

本节将向您展示如何执行最常见的JAR文件操作,并提供每个基本功能的示例:

本节介绍如何使用Jar工具将文件和目录打包到Jar文件中。

您可以显示JAR文件的目录,以查看它包含的内容,而无需实际解压缩JAR文件。

您可以使用Jar工具来解压缩Jar文件。在提取文件时,Jar工具会复制所需的文件并将其写入当前目录,从而重现归档文件中的目录结构。

本节将向您展示如何通过修改现有JAR文件的清单或添加文件来更新现有JAR文件的内容。

本节展示了如何在JAR中调用和运行小程序的应用程序。

其他参考文献

JDK的文档包括Jar工具的参考页:

二、使用清单文件:基础知识

JAR文件支持广泛的功能,包括电子签名、版本控制、包密封等。是什么赋予了JAR文件这种多功能性?答案就是jar包中的manifest文件。

manifest是一个特殊的文件,可以包含JAR文件中打包的文件的信息。通过裁剪清单中包含的这个“元”信息,您可以使JAR文件用于各种目的。

本课程将解释清单文件的内容,并向您展示如何使用它,并提供基本功能的示例:

创建JAR文件时,会自动创建默认清单。本节描述默认清单。

本节向您展示修改清单文件的基本方法。后面的部分将演示您可能需要进行的特定修改。

本节介绍如何使用主要班级用于设置应用程序入口点的清单文件中的头。

本节介绍如何使用类路径在运行applet或应用程序时将其他JAR文件中的类添加到类路径的清单文件中的头。

本节描述如何在清单文件中使用包版本头。

本节介绍如何通过修改清单文件在JAR文件中密封包。

本节介绍如何使用清单属性来提高applet或javawebstart应用程序的安全性。

2.1 了解默认清单

当您创建JAR文件时,它会自动收到默认的清单文件。存档中只能有一个清单文件,并且它总是有路径名

META-INF/MANIFEST.MF

当您创建JAR文件时,默认清单文件仅包含以下内容:

Manifest-Version: 1.0
Created-By: 1.7.0_06 (Oracle Corporation)

这些行表明,清单的条目采取“标题:值”对的形式。标头的名称与其值用冒号分隔。默认清单符合清单规范的1.0版本,由JDK的1.7.0_06版本创建。

清单还可以包含有关存档中打包的其他文件的信息。清单中应该记录哪些文件信息取决于您打算如何使用JAR文件。默认清单没有假设它应该记录哪些关于其他文件的信息。

摘要信息不包含在默认清单中。要了解有关摘要和签名的更多信息,请参阅签名和验证JAR文件课程。

需要注意的是,上面的中文内容是针对JDK8的相关说明,在新的JAVA版本中,JAR文件的规则发生了变化,主要有如下几点:

1、JAVA的模块化能力支持,产生了模块化的JAR。

2、多版本JAR文件。支持同时发布针对多个JAVA Release版本的JAVA资源内容。

比如图中这个内容:

详细的,最新的JAR文件规则说明,见文章最上面的JAVA18的相关链接。