JAR文件是什么
JAR文件是基于ZIP压缩格式的文件格式,用于将JAVA class、META-INF和jar lib等文件压缩为一个JAR文件。与ZIP文件不同的是,JAR文件不仅用于压缩和发布,还用于部署和封装库、组件和插件程序,并且可以被JVM直接使用。
JAR文件可以通过命令行jar工具创建(jar cvf),也可以使用java.util.jarJava平台中的API创建。JAR文件的名称没有限制。
JAR文件使用场景
- 用于发布和使用类库;
- 用于程序的扩展部分;
- 作为程序辅助资源的存在。
JAR文件格式的优势
- 安全性,可以对JAR文件内的内容进行数字化签名。
- 压缩,JAR格式提供压缩可提高存储效率。
- 包装密封,可以选择密封 JAR文件中的包,可以在版本中强制实现一致性。
- 包版本控制,JAR文件可以包含厂商和版本等信息。
- 可移植性,JAT文件可运行在任何JVM环境。
META-INF目录
JAR文件包含一个META-INF目录,用于存储包和扩展的配置数据,如安全性和版本信息。
关于META-INF目录中的文件/目录、配置应用程序、类加载器和服务,Java 2平台有这样的解释:
- MANIFEST.MF:清单文件用于定义扩展和包相关的数据,也是JAR文件运行时解析的核心文件。
- INDEX.LIST:此文件由jar工具的新选项-i生成,该选项包含应用程序中定义的包的位置信息。它是JarIndex实现的一部分,并由类加载器用于加速其类加载过程。
- x.SF,JAR文件的签名文件。x代表基本文件名。
- x.DSA,与签名文件关联的签名块文件,该文件存储相应签名文件的数字签名。
- services/:此目录存储部署在类路径上JAR文件所有服务提供者的配置文件,或部署模块路径上的自动模块的JAR文件。
- versions/:该目录下面包含多版本 JAR的版本化类和资源文件,配合MANIFEST.MF文件Multi-Release属性使用。
JAR MANIFEST
MANIFEST.MF定义扩展和包相关数据,解压JAR文件其中META-INF目录下第一个文件就是MANIFEST.MF,下面分别列举出MANIFEST.MF文件中的各个属性。
一般属性
- Manifest-Version:定义MANIFEST.MF文件版本。
- Created-By:定义生成此MANIFEST.MF文件的生成者,该值由jar工具生成。
- Signature-Version:定义JAR文件的签名版本。
- Class-Path:该属性指定该程序所需库的相对URL,即JAR包的依赖关系,class loader会依据这个路径来搜索class。
- Automatic-Module-Name:java9模块特性后增加属性,如果此JAR文件为java模块,则定义模块名称。
- Multi-Release:java9支持multi-release jar的功能,包括jar、javac、javap、jdeps等命令都能支持这个特性。所谓multi-release jar可以包含多个jdk版本的实现,在运行时JVM根据当前环境加载符合版本的class,这样可以使得jar包在兼容旧版本的同时尽可能早地尝试新版JDK的特性。如果值为true,表示启用多版本特性。
应用程序相关属性
- Main-Class:指定当前JAR文件的入口类,该类必须为可执行类。定义了该属性即可通过 java -jar x.jar来运行该jar文件。
- Launcher-Agent-Class:如果存在此属性,则会在调用应用程序main方法之前启动的java代理的类名。
包版本控制和密封信息定义的属性
这些属性的值适用于JAR文件中的所有包。
- Implementation-Title:值是一个字符串,用于定义扩展实现的标题。
- Implementation-Version:该值是一个字符串,用于定义扩展实现的版本。
- Implementation-Vendor:该值是一个字符串,用于定义维护扩展实现的组织。
- Specification-Title:该值是一个字符串,用于定义扩展规范的标题。
- Specification-Version:该值是一个字符串,用于定义扩展规范的版本。
- Specification-Vendor:该值是一个字符串,用于定义维护扩展规范的组织。
- Sealed:此属性定义此JAR文件是否已密封。值可以是true或false,忽略大小写。如果设置为true,则JAR文件中的所有包都默认为密封,且可以对每个包进行单独定义。