我注意到 JAR、WAR 和 EAR 文件MANIFEST.MF
在该文件夹下有一个文件META-INF
。
文件有什么用MANIFEST.MF
?在这个文件中可以指定什么?
我注意到 JAR、WAR 和 EAR 文件MANIFEST.MF
在该文件夹下有一个文件META-INF
。
文件有什么用MANIFEST.MF
?在这个文件中可以指定什么?
使用 Java 开发工具包 1.0 版创建的 JAR 文件中的 Manifest 文件的内容如下。
Manifest-Version: 1.0
所有条目都是名称-值对。标头的名称与它的值之间用冒号隔开。默认清单表明它符合清单规范的 1.0 版。清单还可以包含有关打包在存档中的其他文件的信息。清单中记录的确切文件信息将取决于 JAR 文件的预期用途。默认清单文件不假设它应该记录关于其他文件的哪些信息,因此它的单行只包含关于它自己的数据。专用清单标题
根据 JAR 文件的预期角色,可能必须修改默认清单。如果创建 JAR 文件只是为了存档,那么 MANIFEST.MF 文件就没有用处。JAR 文件的大多数用途超出了简单的归档和压缩范围,并且需要在清单文件中包含特殊信息。下面总结了一些特殊用途的 JAR 文件函数所需的头文件的简要说明
捆绑为 JAR 文件的应用程序:如果应用程序捆绑在 JAR 文件中,则需要告知 Java 虚拟机该应用程序的入口点是什么。入口点是任何具有公共静态 void main(String[] args) 方法的类。此信息在 Main-Class 标头中提供,该标头具有以下一般形式:
Main-Class: classname
值 classname 将替换为应用程序的入口点。
下载扩展:下载扩展是其他 JAR 文件的清单文件引用的 JAR 文件。在典型情况下,applet 将捆绑在一个 JAR 文件中,该文件的清单引用一个 JAR 文件(或多个 JAR 文件),该文件将用作该 applet 的扩展。扩展可以以相同的方式相互引用。下载扩展在小程序、应用程序或其他扩展的清单文件的 Class-Path 标头字段中指定。Class-Path 标头可能如下所示,例如:
Class-Path: servlet.jar infobus.jar acme/beans.jar
有了这个头文件,servlet.jar、infobus.jar 和 acme/beans.jar 文件中的类将作为 applet 或应用程序的扩展。Class-Path 标头中的 URL 是相对于小程序或应用程序的 JAR 文件的 URL 给出的。
包密封:可以选择密封 JAR 文件中的包,这意味着该包中定义的所有类都必须归档在同一个 JAR 文件中。包可能会被密封以确保软件中类之间的版本一致性或作为安全措施。要密封一个包,需要为包添加一个 Name 标头,然后是一个 Sealed 标头,类似于以下内容:
Name: myCompany/myPackage/
Sealed: true
Name 标头的值是包的相对路径名。请注意,它以“/”结尾以与文件名区分开来。Name 标头之后的任何标头(没有任何中间空行)适用于 Name 标头中指定的文件或包。在上面的示例中,由于 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 文件中包含的文件的信息。
每当创建 JAR 文件时,都会在 META-INF 文件夹中创建默认 manifest.mf 文件,它包含如下默认条目:
Manifest-Version: 1.0
Created-By: 1.7.0_06 (Oracle Corporation)
这些是“header:value”对的条目。第一个指定清单版本,第二个指定用于创建 JAR 文件的 JDK 版本。
Main-Class 标头: 当使用 JAR 文件将应用程序捆绑到包中时,我们需要指定服务于应用程序入口点的类。我们使用清单文件的“Main-Class”标头提供此信息,
主类:{完全限定的类名}
这里的“Main-Class”值是具有 main 方法的类。指定此条目后,我们可以执行 JAR 文件来运行应用程序。
Class-Path 标头: 大多数情况下,我们需要从应用程序 JAR 文件中打包的类访问其他 JAR 文件。这可以通过使用“Class-Path”标头在清单文件中提供它们的完全限定路径来完成,
类路径:{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 文件中。这可以在“密封”标题的帮助下指定,
名称:{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