Java| MANIFEST.MF讲解

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

JAR文件可以可选地在META-INF目录中包含名为MANIFEST.MF的Manifest文件。Manifest文件包含有关JAR文件及其条目的信息。manifest文件被分成由空白行分隔的部分。每个部分包含名称 - 值对。一个新行分隔每个名称/值对。冒号分隔名称及其对应的值。
清单文件必须以新行结束

以下是一个META-INF.MF清单文件

Manifest-Version: 1.0
Class-Path: . cmd_lib/commons-lang3-3.7.jar
Main-Class: com.yveshe.PackageClass
Name: java/util/
Specification-Title: "Java Utility Classes" 
Specification-Version: "1.2"
Specification-Vendor: "Sun Microsystems, Inc.".
Implementation-Title: "java.util" 
Implementation-Version: "build57"
Implementation-Vendor: "Sun Microsystems, Inc."

一般属性介绍

Manifest-Version:
用来定义manifest文件的版本,例如:Manifest-Version: 1.0

Main-Class
定义jar文件的入口类,该类必须是一个可执行的类(包含main方法的类),一旦定义了该属性即可通过 java -jar x.jar来运行该jar文件。
运行Jar: java -jar yveshe.jar
当运行上述命令时JVM将在yveshe.jar文件中的MANIFEST.MF文件中查找Main-Class属性的值,并尝试运行该类。如果在yveshe.jar文件中未包含Main-Class属性,则上述命令将生成错误。

Class-Path:
指定jar包的依赖关系,class loader会依据这个路径来搜索class.默认是相对路径,相对该jar所在的父文件夹.
可以在其manifest 文件中为JAR文件设置CLASSPATH。属性名称叫作类路径,必须在自定义清单文件中指定。 它是一个空格分隔的jar文件,zip文件和目录的列表。(不区分系统都是以空格来分隔多个jar文件)以下是一个属性配置例子:
Class-Path: reference1.jar file:/c:/book/ http://www.yveshe.com/reference2.jar
这条命令配置了该yveshe.jar依赖了三个jar:
一个JAR文件reference1.jar,一个使用文件协议文件的目录:c:/book/和另一个使用HTTP协议的JAR文件http://www.yveshe.com/reference2.jar
注意: 当使用java命令使用-jar(比如java -jar yveshe.jar)选项运行JAR文件时,将忽略Jar中 manifest文件之外的任何CLASSPATH设置。

Sealed:
密封 JAR 文件中的一个包意味着在这个包中定义的所有类都必须在同一个 JAR 文件中找到。这使包的作者可以增强打包类之间的版本一致性。密封还提供了防止代码篡改的手段。
要密封包,需要在 JAR 的 manifest 文件中为包添加一个 Name 头,然后加上值为“true”的 Sealed 头。与可执行的 JAR 一样,可以在创建 JAR 时,通过指定一个具有适当头元素的 manifest 文件密封一个 JAR,如下所示:
Name: com/yveshe/
Sealed: true

Name 头标识出包的相对路径名。它以一个“/”结束以与文件名区别。在 Name 头后面第一个空行之前的所有头都作用于在 Name 头中指定的文件或者包。在上述例子中,因为 Sealed 头出现在 Name 头后并且中间没有空行,所以 Sealed 头将被解释为只应用到包 com/yveshe上。如果试图从密封包所在的 JAR 文件以外的其他地方装载密封包中的一个类,那么 JVM 将抛出一个SecurityException 。文件头Name的值为该封装的相对路径名。注意,该路径名由‘/’结束以区别于文件名。

在下面的代码中Sealed仅仅作用于name: com/yveshe/意思是包com.yveshe下的代码不允许被外部类加载调用.

Manifest-Version: 1.0
Class-Path: . cmd_lib/commons-lang3-3.7.jar
Main-Class: com.yveshe.PackageClass
Name: java/util/
Specification-Title: "Java Utility Classes" 
Specification-Version: "1.2"
Specification-Vendor: "Sun Microsystems, Inc.".
Implementation-Title: "java.util" 
Implementation-Version: "build57"
Implementation-Vendor: "Sun Microsystems, Inc."

name: com/yveshe/
Sealed: true

书写注意:

1.每行的“:”(冒号)用来分隔键值对,冒号后边一定要跟一个空格.
2.MANIFEST.MF清单文件必须以一个空白行结束.
3.Class-Path里边的内容用空格分隔而不是逗号或者分号。
4.每行不能超过七十多的字符.

猜你喜欢

转载自blog.csdn.net/u011479200/article/details/80097886