Jar包的清单文件manifest.MF

Posted 镇魂帆2

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Jar包的清单文件manifest.MF相关的知识,希望对你有一定的参考价值。

如何在Java中使用JAR Manifest文件

[摘录](如何在Java中使用JAR Manifest文件(附实例) - 掘金 (juejin.cn))

在Java编程语言中,清单文件是一个文本文件,它包含与程序员的JAR归档文件中包含的文件有关的元数据。这种元数据的范围可以从与包信息有关的信息到安全属性的属性。

一个程序在其JAR归档中只能有一个清单文件,因此,对于开发人员来说,了解如何与这些清单文件打交道以及如何正确使用它们非常重要。在这个Java教程中,你将学习如何在你的Java应用程序中使用JAR清单文件。

Java中的默认清单文件

当您创建一个JAR文件时,也会随之创建一个默认的清单文件。该文件最初包含与清单版本和 JDK 版本有关的两个字段。例如,以下是一个典型的清单文件的内容:

Manifest-Version: 1.0
Created-By: 11.0.3 (Oracle Corporation)

默认清单总是位于JAR文件的路径META-INF/MANIFEST.MF中。

如何在 Java 中修改清单文件

开发人员可以手动修改清单文件,也可以在创建JAR文件时使用m选项来修改。手动修改文件意味着直接向其中添加条目。

正如您在上一节所注意到的,JAR文件包含头:值对。你也可以为你想要的头:值对添加一个条目。然而,需要注意的是,在最后一个条目之后,程序员应该添加一个新行字符。否则,最后一个条目将不能被正确解析。

另外,程序员也可以使用m选项来修改JAR清单文件,如下所示:

jar cfm ArchiveName.jar  add-to-manifest.txt files-to-include

m选项指定您打算将某个文本文件(如add-to-manifest.txt)中的某些信息合并到您现有的JAR清单文件中。

开发人员必须注意,f和m选项的出现顺序应与各自的参数相匹配。您还需要确保您的文本文件以一个新行字符结束。

接下来的两节描述了一些特殊的用例,你可以用你的JAR文件来应用。

JAR文件和Java应用程序打包

JAR文件有时被用来包装Java应用程序。当你决定在JAR文件中运行一个应用程序时,程序员需要指定要使用的入口点。入口点是指你的main()*方法所定义的类。要定义你的应用程序的入口点,请使用*Main-Class头。

例如,如果您的入口点是PackageName包中的ClassName,那么您应该在清单文件中包含以下条目:

Main-Class: PackageName.ClassName

要在你的JAR归档中运行应用程序,你现在可以使用下面的命令:

java -jar  ArchiveName.jar

你也可以使用JAR工具的e选项为你的应用程序设置入口点。需要注意的是,该选项会覆盖您清单文件中的Main-Class头。

下面的Java代码示例创建了一个名为ArchiveName.jar的归档文件,入口点设置为MyClass.class

jar cfe ArchiveName.jar * MyClass.class

在更新您的JAR归档文件时,您也可以使用e选项。如果你的入口点在一个目录中(比如说MyDirectory),那么你在命令行中指定它时可以使用正斜线\'/\'

jar cfe ArchiveName.jar * MyDirectory/MyClass.class

如何将类添加到JAR Classpath中

在打包你的应用程序时,程序员可能会把不同的类放在几个jar文件中。这里有一个很好的例子,如果一个打包在JAR归档文件中的小程序与打包在不同JAR归档文件中的依赖关系。

为了确保另一个JAR归档文件中的类在你运行时被加载到你的JAR文件中,你需要在你的调用JAR文件中添加它们的classpath

只要在清单文件的Class-Path头中设置路径就可以了。例如,如果要加载的JAR文件与您的调用JAR文件在同一目录下,您可以使用下面的方法:

Class-Path: Other-JAR-File.jar

关于 Java 清单文件的最终想法

清单文件允许开发人员描述与JAR存档中的文件有关的信息。如前所述,一定要记得用一个新行字符来结束你的JAR文件的修改文本文件。

jar包的MANIFEST.MF文件

打包可执行jar包时,MANIFEST.MF总是个让人头疼的东西,经常出现这种那种问题。 
一个例子: 
================================================================================ 
Manifest-Version: 1.0 
Main-Class: test.Main 
Class-Path: ./ ./lib/commons-collections-3.2.jar ./lib/commons-dbcp-1.2.2.jar 
  ./lib/commons-lang-2.3.jar ./lib/commons-logging-1.1.jar 

================================================================================ 
各部分解释: 
Manifest-Version MF文件版本号 
Main-Class 包含main方法的类 
Class-Path 执行这个jar包时的ClassPath 

以下是需要注意的各个要点: 
1. Manifest-Version、Main-Class和Class-Path后面跟着一个英文的冒号,冒号后面必须跟着一个空格,然后才是版本号、类和ClassPath。 
2. Class-Path中的各项应使用空格分隔,不是逗号或分号。 
3. Class-Path中如果有很多项,写成一行打包的时候会报错line too long,这时需要把Class-Path分多行写。注意:从第二行开始,必须以两个空格开头,三个以上我没试过,不过不用空格开头和一个空格开头都是不行的,我已经试过了。 
4. Class-Path写完之后最后一定要有一个空行。 
5. jar包内有些配置文件想放在jar包外面,比如文件config.properties:如果这个文件是以路径方式载入的,比如new file("./config/config.properties"),那么将config.properties放在jar包相同目录下的config目录下即可,也就是说“./”路径等价于jar包所在目录;如果这个文件是以ClassPath下的文件这种方式载入的,比如在Spring中载入classpath:config.properties,则在MF文件的配置文件的ClassPath中添加“./”,然后将这个配置文件与jar包放在同一个目录即可,当然也可以在MF文件的配置文件的ClassPath中添加“./config/”,然后把配置文件都放在jar包相同目录下的config目录下。

 

 

以上是关于Jar包的清单文件manifest.MF的主要内容,如果未能解决你的问题,请参考以下文章

解决 xx.jar中没有主清单属性 问题

Jar包的格式

jar包的MANIFEST.MF文件

jar包的MANIFEST.MF文件

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

Java jar - 没有主要清单属性