在Java中使用MANIFEST.MF文件

时间:2012-10-07 10:13:10

标签: java manifest.mf

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

MANIFEST.MF文件有什么用?可以在此文件中指定所有内容吗?

2 个答案:

答案 0 :(得分:80)

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

Manifest-Version: 1.0

所有条目都是名称 - 值对。标题的名称通过冒号与其值分隔。默认清单显示它符合清单规范的1.0版。 清单还可以包含有关存档中打包的其他文件的信息。清单中记录的文件信息究竟取决于JAR文件的预期用途。默认清单文件不会假设它应记录哪些关于其他文件的信息,因此其单行仅包含有关其自身的数据。 专用清单标题

根据JAR文件的预期角色,可能必须修改默认清单。如果仅为了存档而创建JAR文件,则MANIFEST.MF文件没有任何意义。 JAR文件的大多数用法不仅仅是简单的归档和压缩,还需要特殊信息才能存在于清单文件中。下面总结了一些特殊用途JAR文件函数所需的标题的简要描述

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

Main-Class: classname

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

下载扩展程序:下载扩展程序是其他JAR文件的清单文件引用的JAR文件。在典型情况下,applet将捆绑在JAR文件中,该文件的清单引用JAR文件(或多个JAR文件),这些文件将作为该applet用途的扩展。扩展可以以相同的方式相互引用。 下载扩展名在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是相对于applet或应用程序的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."

答案 1 :(得分:17)

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:{完全合格的classname}

这里的'Main-Class'值是具有main方法的类。指定此条目后,我们可以执行JAR文件来运行应用程序。

Class-Path标头: 大多数情况下,我们需要从应用程序的JAR文件中打包的类中访问其他JAR文件。这可以通过使用“Class-Path”标题

在清单文件中提供完全限定的路径来完成

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应用程序或applet的安全性具有“权限”,“Codebae”,“应用程序名称”,“仅受信任”等不同属性。< / p>

META-INF文件夹:

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

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