我注意到JAR,WAR和EAR MANIFEST.MF
文件在该META-INF
文件夹下有一个文件。
该MANIFEST.MF
文件有什么用?在此文件中可以指定什么?
我注意到JAR,WAR和EAR MANIFEST.MF
文件在该META-INF
文件夹下有一个文件。
该MANIFEST.MF
文件有什么用?在此文件中可以指定什么?
Answers:
以下是用Java开发工具包1.0版创建的JAR文件中的清单文件的内容。
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文件。在典型情况下,小应用程序将捆绑在一个JAR文件中,该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是相对于applet或应用程序的JAR文件的URL给出的。
程序包密封:可以选择密封JAR文件中的程序包,这意味着必须将该程序包中定义的所有类归档在同一JAR文件中。可以对软件包进行密封,以确保软件中各类之间的版本一致性,或者作为安全措施。要密封包装,需要为包装添加一个Name标头,然后添加一个Sealed标头,类似于:
Name: myCompany/myPackage/
Sealed: true
Name标头的值是程序包的相对路径名。请注意,它以“ /”结尾以将其与文件名区分开。名称标头之后的所有标头(中间无空白行)适用于名称标头中指定的文件或包。在上面的示例中,由于Sealed标头出现在Name:myCompany / myPackage标头之后,之间没有空行,因此Sealed标头将解释为(仅)应用于包myCompany / myPackage。
程序包版本控制:程序包版本控制规范定义了几个清单标头来保存版本信息。可以将一组这样的头分配给每个包。版本标头应直接出现在包的Name标头下方。此示例显示所有版本控制标头:
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文件来运行该应用程序。
类路径头: 大多数时候,我们需要从应用程序的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应用程序或其包含不同属性的小程序的安全性,这些属性具有“权限”,“ Codebae”,“应用程序名称”,“仅受信任”等属性。
META-INF文件夹:
清单文件所在的文件夹。此外,它可以包含更多文件,其中包含有关应用程序的元数据。例如,在EJB模块JAR文件中,此文件夹包含EJB模块的EJB部署描述符以及JAR的清单文件。而且,它包含xml文件,该文件包含抽象EJB引用到将在其上运行的应用程序服务器的具体容器资源的映射。
参考:https :
//docs.oracle.com/javase/tutorial/deployment/jar/manifestindex.html