Java 中处理 JAR 和 Manifest 文件

17 Mar 2025 | 5 分钟阅读

Java Archive (JAR) 文件是打包和分发 Java 应用程序的常用方式。JAR 文件是一种压缩文件格式,其中包含 Java 类文件、资源(如图像和属性文件)以及元数据。它通过将所有内容捆绑到一个存档中,简化了 Java 应用程序的分发。

创建 JAR 文件 - 更多选项

  • jar - file: 这是我们要使用 jar 命令进行操作的 JAR 文件名。
  • file1, file2, file3: 我们希望将这些文件添加到 JAR 文件中。如果这些文件中的任何一个目录,jar 程序将递归地处理它们,包括它们的所有内容。
  • manifest-file: 这是包含 JAR 文件清单的可选文件名。清单是对存档内容和来源的描述。虽然每个存档都有默认清单,但用户可以提供自己的清单来验证存档的内容。
  • c: 创建一个新的或空的存档,并将指定的文件添加进去。
  • C: 在处理指定文件之前,暂时更改目录。
  • e: 在清单中创建一个入口点,为可执行 JAR 文件定义主类。
  • f: 将 JAR 文件名指定为第二个命令行参数。如果缺少此参数,则 jar 工具在创建 JAR 文件时会将结果写入标准输出,或在提取或列出 JAR 文件时从标准输入读取。
  • i: 创建索引文件。
  • m: 向 JAR 添加清单文件。用户可以提供自己的清单来验证存档的内容。
  • M: 不为条目创建清单文件。
  • t: 显示 JAR 文件的内容列表。
  • u: 使用新文件或修改后的文件更新现有 JAR 文件。
  • v: 生成详细输出,在 JAR 创建过程中提供详细信息。
  • x: 从 JAR 中提取文件。如果提供了特定的文件名,则只提取这些文件;否则,提取所有文件。
  • 0: 以未压缩的 ZIP 格式存储文件。

示例

要创建包含两个类 HelloWorld.class 和 Greet.class 的 JAR 文件,需要编写以下命令:


Working with JAR and Manifest files In Java

1. 创建两个 Java 类

文件名: HelloWorld.java

文件名: Greet.java

2. 编译 Java 类

保存这些文件,然后使用提供的命令进行编译:

3. 创建一个清单文件

生成一个名为 Manifest.txt 的文本文件,并包含以下内容:

4. 创建 JAR 文件

现在,使用以下命令创建 JAR 文件:

上面的命令创建了一个名为 HelloWorldApp.jar 的 JAR 文件,其中包含指定的清单文件和两个已编译的类文件。

5. 运行 JAR 文件

最后,我们可以使用以下命令运行 JAR 文件:

输出

Working with JAR and Manifest files In Java

清单文件

在 JAR(Java Archive)文件的上下文中,清单文件是一个特殊文件,它提供了有关 JAR 文件内容元数据的信息。清单文件通常命名为 MANIFEST.MF,位于 JAR 文件内的 META-INF 目录中。它包含诸如可执行 JAR 文件的主类、版本信息和其他属性等信息。

Working with JAR and Manifest files In Java

清单文件(用于 JAR 文件)将信息组织到各个部分,每个部分都有一个名称和一个相应的值。这些部分有助于控制存档的各种属性。在使用 `jar` 命令的 `m` 选项更新清单文件时,必须格外小心。不正确的修改可能导致错误或意外问题。因此,在修改清单文件时,遵循指南至关重要,以确保 JAR 文件的正常运行。我们可能会遇到以下错误。

处理清单文件时要牢记的事项

1. 在清单文件中,段名称和其值之间包含一个空格至关重要。例如,写 Version:1.1 是无效的;应该写成 Version: 1.1。冒号后有空格对于正确的格式至关重要。

2. 在清单文件中指定主类时,请勿在类名后添加 .class 扩展名。只需像这样指示主类:

(稍后将对 Main-Class 部分进行详细说明。)

3. 确保清单文件的末尾有一个换行符。我们可以通过使文件的最后一行留空来实现这一点。无需显式写入 "\n" 来表示换行。

4. 此外,必须使用 UTF-8 编码来处理包含清单的文本文件。否则可能会导致潜在问题,这凸显了编码考虑的重要性。

示例

要修改我们 "HelloWorldApp.jar" 存档的内容并更新清单文件,我们可以使用以下命令:

在这种情况下,更新后的清单文件名为 "Manifest.txt",其内容如下:

Working with JAR and Manifest files In Java

输出

Working with JAR and Manifest files In Java

可执行 JAR 文件

jar 命令的 -e 选项允许我们指定 Java 应用程序的入口点。入口点通常是我们希望在启动程序时执行的主类。

示例

为了生成一个 "HelloWorldApp.jar" 文件,将 "Client" 类指定为主类,我们可以使用 jar 命令和 -e 选项。示例如下:

输出

Working with JAR and Manifest files In Java

使用 -e 选项在 jar 命令中指定主类时,请勿在类名后包含 ".class" 扩展名。另一种方法是将 Main-Class 条目直接添加到清单文件中,然后进行更新。在这种情况下,我们只需在清单文件中插入以下条目:

设置主类后,我们可以使用以下命令有效地运行 JAR 程序:

根据操作系统的配置,用户可以通过双击 JAR 文件图标来启动应用程序,这可能会很方便。系统设置决定了此行为,允许用户在无需命令行输入的情况下启动应用程序。

包密封

在 Java 中,包密封可确保无法向特定包添加其他类。当在代码中使用包私有(package-visible)的类、方法和字段时,这一点尤为重要。没有包密封,就存在其他类插入到同一包中,从而访问本应在包中可见的功能的风险。

  • 要密封 Java 中的包,只需将该包的所有类放入 JAR 文件中即可。
  • JAR 文件包默认不密封,但我们可以通过在清单文件中添加特定行来全局修改此默认设置。
  • 在清单文件中使用 `Sealed: true` 密封 JAR 文件意味着锁定该 JAR 中的特定包。它确保这些包中的类来自同一来源,并防止其他 JAR 文件被修改或扩展。
  • 包名称必须以 "/" 结尾。