diff --git a/source/_posts/about-jar-manifest.md b/source/_posts/about-jar-manifest.md new file mode 100644 index 0000000..3d2b012 --- /dev/null +++ b/source/_posts/about-jar-manifest.md @@ -0,0 +1,59 @@ +--- +title: Jar文件中MANIFEST.MF的使用 +tags: + - JVM + - Java + - Jar + - MANIFEST.MF + - classpath +categories: + - - JVM + - Java +keywords: 'Java,jar,MANIFEST,MF,MANIFEST.MF,打包,classpath' +date: 2021-06-01 17:51:21 +--- + +MANIFEST.MF是Java程序发布为Jar文件时用来定义Jar文件相关数据的清单文件。这是一个Jar文件的元数据文件,其中包含了由预定义项目组成的键值对,描述了Jar文件以及其中组成Jar文件的相关内容的信息。 + +## Manifest文件的格式 + +Manifest文件一般命名为`MANIFEST.MF`,放置于Jar文件的`META-INF`目录中,对于正在开发的程序,可以放置在`Resources/META-INF`目录中。Manifest文件中可以使用空白行将其分隔为若干区域,每个区域定义不同的项目内容以加强文件内容的可读性。Manifest文件的每一行只能包含一组键值对,比使用`:`分隔项目键和项目值,在`:`后需要跟一个空格。 + +!!! caution "重要" + Manifest文件必须以一个空白行结束。 + +以下是一个Manifest文件的示例。 + +``` +Manifest-Verison: 1.0 +Class-Path: . libs/commons-io.jar +Main-Class: xyz.archgrid.demo.app.Application +``` + +## 常用属性介绍 + +Manifest文件一般并不需要手动编辑,在目前使用Gradle和Maven完成项目构建的情况下,Manifest文件都会由构建工具生成。但是即便是可以使用构建工具自动生成,在大多数情况下也是需要在构建配置文件中设置一些内容的,而这些内容往往都与Manifest文件中可用的属性直接相似或者相同。 + +所以常用的Manifest文件属性主要有以下这些。 + +* `Manifest-Version`,定义Manifest文件的版本,通常取值为`1.0`。 +* `Main-Class`,定义Jar文件的入口类,这个类必须包含一个静态的`main()`方法。当定义了这个属性,就可以通过`java -jar xxx.jar`命令来直接运行Jar文件。 +* `Class-Path`,定义Jar文件的类依赖关系,类加载器会依据这里的路径设置来检索Jar文件中所使用到的所有类。 + * `Class-Path`属性默认使用Jar文件所在的目录作为原始路径,其他路径均相对于这个原始路径设置。 + * 路径`./`表示Jar文件所在目录,如果设置了这个目录,那么Jar文件所依赖的其他第三方Jar库文件就可以与Jar文件并列放置。 + * 如果需要使用使用绝对路径可以使用`file:/`引导的文件系统协议,此外还可以使用网络路径。 + * 多个路径之间可以使用空格隔开。 + * 因为Manifest文件一行最多只能放置70个字符,所以对于超长的`Class-Path`属性需要分行书写,从第二行开始每行需要空两个空格开始。 + * 分多行书写的时候,`Class-Path`属性之后需要放置一个空白行。 +* `Sealed`,指示这个包中所定义的类都必须在同一个Jar包中存在。如果在Manifest文件中设置`Sealed: true`时,必须配合设置`name`属性。`name`属性定义的目录下的代码将不能够被外部类加载调用。 +* `Extension-Name`,定义Jar文件的标识。 +* `Implementation-Title`,定义扩展实现的标题。 +* `Implementation-Version`,定义扩展实现的版本。 +* `Implementation-Vendor`,定义扩展实现的组织名称。 +* `Implementation-Vendor-Id`,定义扩展实现的组织标识。 +* `Implementation-URL`,定义当前扩展包的下载地址。 +* `Specification-Title`,定义扩展规范的标题。 +* `Specification-Version`,定义扩展贵单的版本。 +* `Specification-Vendor`,定义维护该规范的组织名称。 + +通常一个Jar文件的Manifest文件内容只需要定义前三个属性即可。 \ No newline at end of file