在 Java 中使用 MANIFEST.MF 文件

Posted

技术标签:

【中文标题】在 Java 中使用 MANIFEST.MF 文件【英文标题】:Use of the MANIFEST.MF file in Java 【发布时间】:2012-09-27 21:17:06 【问题描述】:

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

MANIFEST.MF 文件有什么用?在这个文件中可以指定什么?

【问题讨论】:

en.wikipedia.org/wiki/Manifest_file 见Working with Manifest Files: The Basics。 【参考方案1】:

使用 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

值类名将替换为应用程序的入口点。

下载扩展: 下载扩展是由其他 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."

【讨论】:

请不要抄袭别人的作品。您应该添加指向网页的链接。 docs.oracle.com/javase/tutorial/deployment/jar/sealman.html 这不是副本,更像是一个摘要......共 5 页。 您可以调用此摘要。句子被复制,没有任何额外的结论或要点。我认为您应该尊重某人的工作并添加链接和引号。【参考方案2】:

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-Class”值是具有 main 方法的类。指定此条目后,我们可以执行 JAR 文件来运行应用程序。

类路径标头: 大多数时候,我们需要从应用程序 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/ 密封:真

这里,包名必须以'/'结尾。

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

我们可以使用清单文件条目来确保 Web 应用程序的安全性,或者使用不同属性打包它的小程序,例如“权限”、“代码库”、“应用程序名称”、“仅受信任”等等。

META-INF 文件夹:

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

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

【讨论】:

以上是关于在 Java 中使用 MANIFEST.MF 文件的主要内容,如果未能解决你的问题,请参考以下文章

Jar包的清单文件manifest.MF

如何使用 Bash 从 JAR 中读取 MANIFEST.MF 文件

MANIFEST.MF文件详解

Java项目打的jar包中MANIFEST.MF文件中没有依赖jar包信息和主函数信息是啥情况?

MANIFEST.MF 文件内容完全详解(转)

JAR包中的MANIFEST.MF文件详解以及编写规范