在Java中使用MANIFEST.MF文件

我注意到JAR,WAR和EAR文件在META-INF文件夹下有一个MANIFEST.MF文件。

MANIFEST.MF文件的用途是什么? 什么东西可以在这个文件中指定?

使用Java Development Kit 1.0版创build的JAR文件中的Manifest文件的内容如下所示。

 Manifest-Version: 1.0 

所有的条目都是名称 – 值对。 标题的名称与冒号分隔。 默认清单显示它符合清单规范的版本1.0。 清单还可以包含有关存档中打包的其他文件的信息。 清单中logging的文件信息的具体取决于JAR文件的预期用途。 默认的清单文件不会假定它应该logging关于其他文件的信息,所以它的单行只包含关于它自己的数据。 特殊用途清单标题

根据JAR文件的预期angular色,可能需要修改默认清单。 如果JAR文件仅用于存档目的,则MANIFEST.MF文件是没有用的。 JAR文件的大多数用途不仅限于简单归档和压缩,而且需要特殊信息才能在清单文件中。 以下汇总了一些特殊用途JAR文件function所需的头文件的简要说明

捆绑为JAR文件的应用程序如果应用程序捆绑在JAR文件中,则需要告知Java虚拟机什么是应用程序的入口点。 入口点是具有公共静态void main(String [] args)方法的任何类。 这些信息在Main-Class头文件中提供,其格式如下:

 Main-Class: classname 

值类名将被replace为应用程序的入口点。

下载扩展:下载扩展是由其他JAR文件的清单文件引用的JAR文件。 在一个典型的情况下,一个applet将被绑定到一个JAR文件中,该JAR文件的清单引用了一个JAR文件(或者几个JAR文件),这个JAR文件将作为该applet的扩展。 扩展可能会以相同的方式引用对方。 下载扩展名在Applet,应用程序或其他扩展的清单文件中的Class-Path标题字段中指定。 类path头可能看起来像这样,例如:

 Class-Path: servlet.jar infobus.jar acme/beans.jar 

通过这个头文件,文件servlet.jar,infobus.jar和acme / beans.jar中的类将作为applet或应用程序的扩展。 Class-Path头中的URL是相对于applet或应用程序的JAR文件的URL而给出的。

软件包密封:可以select密封JAR文件中的软件包,这意味着该软件包中定义的所有类必须存档在相同的JAR文件中。 软件包可能被密封以确保软件中的类之间的版本一致性或作为安全措施。 为了封装一个包,需要为包添加一个名称头,然后是一个密封头,类似如下:

 Name: myCompany/myPackage/ Sealed: true 

Name头的值是包的相对path名。 注意,它以'/'结尾以区别于文件名。 名称标题后面的任何标题,没有任何中间的空行,适用于名称标题中指定的文件或包。 在上面的例子中,由于Sealed头部出现在Name:myCompany / myPackage头部后面,两者之间没有空行,所以Sealed头部将被解释为仅适用于包myCompany / myPackage。

软件包版本控制:软件包版本控制规范定义了几个清单标题来保存版本信息。 一套这样的标题可以分配给每个包。 版本化标题应该直接出现在包的名称标题下。 此示例显示了所有版本化标头:

 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.MF包含有关JAR文件中包含的文件的信息。

每当创build一个JAR文件时,在META-INF文件夹中创build一个默认的manifest.mf文件,它包含如下的默认条目:

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

这些是“头:值”对的条目。 第一个指定清单版本,第二个指定用于创buildJAR文件的JDK版本。

Main-Class头文件:当使用JAR文件将包中的应用程序打包时,我们需要指定提供应用程序入口点的类。 我们使用清单文件的“Main-Class”标题提供这些信息,

主要类:{完全合格的类名}

这里的“Main-Class”值是主要方法的类。 指定这个入口后,我们可以执行JAR文件来运行应用程序。

类path头:我们大多数时候需要从应用程序的JAR文件中打包的类访问其他JAR文件。 这可以通过使用“Class-Path”头部在清单文件中提供其完全合格的path来完成,

Class-Path:{jar1-name jar2-name directory-name / jar3-name}

此标头可用于在同一本地networking上指定外部JAR文件,而不是在当前JAR中。

包版本相关头文件:当使用JAR文件进行包版本化时,将使用以下头文件,如Java语言规范所指定的:

 Headers in a manifest Header | Definition ------------------------------------------------------------------- Name | The name of the specification. Specification-Title | The title of the specification. Specification-Version | The version of the specification. Specification-Vendor | The vendor of the specification. Implementation-Title | The title of the implementation. Implementation-Version | The build number of the implementation. Implementation-Vendor | The vendor of the implementation. 

封装密​​封相关的标题:

我们还可以指定JAR文件中的任何特定的包是否应该被封装,这意味着该包中定义的所有类必须存档在同一个JAR文件中。 这可以在“密封”标题的帮助下指定,

名称:{package / some-package /}密封:true

在这里,包名必须以“/”结尾。

使用清单文件增强安全性:

我们可以使用清单文件条目来确保它所包装的Web应用程序或小应用程序的安全性,这些应用程序或小应用程序使用“Permissions”,“Codebae”,“Application-Name”,“Trusted-Only”等不同的属性进行打包。

META-INF文件夹:

该文件夹是清单文件所在的位置。 而且,它可以包含更多包含关于应用程序的元数据的文件。 例如,在EJB模块JAR文件中,此文件夹包含EJB模块的EJB部署描述符以及JAR的清单文件。 此外,它还包含xml文件,其中包含将抽象EJB引用映射到将在其上运行的应用程序服务器的具体容器资源的映射。

参考:
https://docs.oracle.com/javase/tutorial/deployment/jar/manifestindex.html