post:增加Manifest.mf文件的使用。

This commit is contained in:
徐涛 2021-06-01 17:51:47 +08:00
parent 7b25205c53
commit fe18923811

View File

@ -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文件的相关内容的信息。<!-- more -->
## 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文件内容只需要定义前三个属性即可。