清单的使用。Java 中的 MF 文件
我注意到JAR,WAR和EAR文件在文件夹下有一个文件。MANIFEST.MF
META-INF
该文件有什么用?此文件中可以指定哪些所有内容?MANIFEST.MF
我注意到JAR,WAR和EAR文件在文件夹下有一个文件。MANIFEST.MF
META-INF
该文件有什么用?此文件中可以指定哪些所有内容?MANIFEST.MF
使用 Java 开发工具包的 1.0 版创建的 JAR 文件中的清单文件的内容如下。
Manifest-Version: 1.0
所有条目都是名称-值对。标头的名称与其值之间用冒号分隔。默认清单显示它符合清单规范的 1.0 版。清单还可以包含有关存档中打包的其他文件的信息。清单中究竟记录了哪些文件信息将取决于 JAR 文件的预期用途。默认清单文件不假定它应该记录有关其他文件的信息,因此其单行仅包含有关其自身的数据。特殊用途清单标头
根据 JAR 文件的预期角色,可能必须修改默认清单。如果 JAR 文件仅用于存档目的,则为清单。MF 文件是没有用的。JAR 文件的大多数用途不仅仅是简单的存档和压缩,并且需要在清单文件中提供特殊信息。下面总结了一些特殊用途的JAR文件函数所需的标头的简要说明
捆绑为 JAR 文件的应用程序:如果应用程序捆绑在 JAR 文件中,则需要告知 Java 虚拟机应用程序的入口点是什么。入口点是具有公共静态 void main(String[] args) 方法的任何类。此信息在 Main-Class 标头中提供,其一般形式为:
Main-Class: classname
值类名将替换为应用程序的入口点。
下载扩展:下载扩展名是由其他 JAR 文件的清单文件引用的 JAR 文件。在典型情况下,小程序将捆绑在 JAR 文件中,该文件的清单引用了一个 JAR 文件(或多个 JAR 文件),该文件将用作该小程序的扩展。扩展可以以相同的方式相互引用。下载扩展在小程序、应用程序或其他扩展的清单文件的“类路径标头”字段中指定。类路径标头可能如下所示,例如:
Class-Path: servlet.jar infobus.jar acme/beans.jar
有了这个头文件,文件 servlet.jar、infobus.jar 和 acme/bean.jar 中的类将用作小程序或应用程序用途的扩展。类路径标头中的 URL 是相对于小程序或应用程序的 JAR 文件的 URL 给出的。
包装密封:可以选择密封 JAR 文件中的包,这意味着该包中定义的所有类都必须存档在同一个 JAR 文件中。可以密封包以确保软件中类之间的版本一致性或作为安全措施。要密封包,需要为包添加一个 Name 标头,后跟一个密封标头,类似于:
Name: myCompany/myPackage/
Sealed: true
Name 标头的值是包的相对路径名。请注意,它以“/”结尾,以将其与文件名区分开来。Name 标头后面的任何标头(没有任何中间的空行)将应用于 Name 标头中指定的文件或包。在上面的示例中,由于“密封”标头出现在 Name: myCompany/myPackage 标头之后,中间没有空行,因此“密封”标头将被解释为(仅)应用于包 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."
附加信息:https://docs.oracle.com/javase/tutorial/deployment/jar/manifestindex.html
Manifest.MF 包含有关 JAR 文件中包含的文件的信息。
每当创建 JAR 文件时,都会在 META-INF 文件夹中创建一个默认的 manifest.mf 文件,它包含如下默认条目:
Manifest-Version: 1.0
Created-By: 1.7.0_06 (Oracle Corporation)
这些是作为“header:value”对的条目。第一个指定清单版本,第二个指定用于创建 JAR 文件的 JDK 版本。
主类标头:当使用 JAR 文件将应用程序捆绑到包中时,我们需要指定为应用程序的入口点提供服务的类。我们使用清单文件的“主类”标头提供此信息,
主类:{完全限定的类名}
这里的“Main-Class”值是具有main方法的类。指定此条目后,我们可以执行 JAR 文件来运行应用程序。
类路径标头:大多数时候,我们需要从应用程序 JAR 文件中打包的类访问其他 JAR 文件。这可以通过使用“类路径”标头在清单文件中提供其完全限定的路径来完成。
类路径: {jar1-name jar2-name directory-name/jar3-name}
此标头可用于指定同一本地网络上的外部 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 文件中。这可以在“密封”标题的帮助下指定,
名称:{包/某包/} 密封:真
此处,包名称必须以“/”结尾。
使用清单文件增强安全性:
我们可以使用清单文件条目来确保Web应用程序的安全性,或者使用不同的属性(如“权限”,“Codebae”,“应用程序名称”,“仅受信任”等属性进行小程序打包。
元 INF 文件夹:
此文件夹是清单文件所在的位置。此外,它可以包含更多包含有关应用程序的元数据的文件。例如,在 EJB 模块 JAR 文件中,此文件夹包含 EJB 模块的 EJB 部署描述符以及 JAR 的清单文件。此外,它还包含一个 xml 文件,该文件包含抽象 EJB 引用的映射,该引用将在其上运行它的应用程序服务器的具体容器资源。
参考资料:
https://docs.oracle.com/javase/tutorial/deployment/jar/manifestindex.html