# 创建 JAR 文件

> 原文： [https://docs.oracle.com/javase/tutorial/deployment/jar/build.html](https://docs.oracle.com/javase/tutorial/deployment/jar/build.html)

用于创建 JAR 文件的命令的基本格式为：

```
jar cf jar-file input-file(s)

```

此命令中使用的选项和参数是：

*   `c` 选项表示您希望 _ 创建 _ JAR 文件。
*   `f` 选项表示您希望输出转到 _ 文件 _ 而不是`标准输出`。
*   `jar 文件`是您希望生成的 JAR 文件具有的名称。您可以使用任何文件名作为 JAR 文件。按照惯例，JAR 文件名被赋予 `.jar` 扩展名，但这不是必需的。
*   `输入文件`参数是要包含在 JAR 文件中的一个或多个文件的空格分隔列表。 `输入文件`参数可以包含通配符 `*` 符号。如果任何“输入文件”是目录，则这些目录的内容将以递归方式添加到 JAR 存档中。

`c` 和 `f` 选项可以按任意顺序出现，但它们之间不能有任何空格。

此命令将生成压缩的 JAR 文件并将其放在当前目录中。该命令还将为 JAR 存档生成[默认清单文件](defman.html)。

* * *

**Note:** 

JAR 文件中的元数据（例如清单的条目名称，注释和内容）必须以 UTF8 编码。

* * *

您可以将以下任何附加选项添加到基本命令的 `cf` 选项中：

<caption>**jar command options**</caption>
| 选项 | 描述 |
| --- | --- |
| `v` | 在构建 JAR 文件时，在 `stdout` 上生成 _ 详细 _ 输出。详细输出告诉您每个文件的名称，因为它已添加到 JAR 文件中。 |
| `0` （零） | 表示您不希望压缩 JAR 文件。 |
| `M` | 表示不应生成默认清单文件。 |
| `m` | 用于包括现有清单文件中的清单信息。使用此选项的格式为：

```
 jar cmf  jar 文件 现有清单 输入文件 
```

有关此选项的更多信息，请参阅[修改清单文件](modman.html)。

* * *

**警告：**清单必须以新行或回车结束。如果最后一行没有以新行或回车结束，则不会正确解析。

* * *

 |
| `-C` | 在执行命令期间更改目录。请参阅下面的示例。 |

* * *

**Note:** 

创建 JAR 文件时，创建时间存储在 JAR 文件中。因此，即使 JAR 文件的内容没有更改，当您多次创建 JAR 文件时，生成的文件也不完全相同。在构建环境中使用 JAR 文件时，应该注意这一点。建议您使用清单文件中的版本控制信息而不是创建时间来控制 JAR 文件的版本。请参阅[设置包版本信息](packageman.html)部分。

* * *

## 一个例子

我们来看一个例子。一个简单的 `TicTacToe` 小程序。您可以通过从 [Java SE 下载](http://www.oracle.com/technetwork/java/javase/downloads/index.html)下载 JDK 演示和示例包来查看此 applet 的源代码。此演示包含具有以下结构的类文件，音频文件和图像：

<center>![TicTacToe folder Hierarchy](img/562a451db5e5ce820d754b8d57666280.jpg)

<center>**TicTacToe folder Hierarchy**</center>

</center>

`音频`和`图像`子目录包含小程序使用的声音文件和 GIF 图像。

在线下载整个教程时，您可以从 _jar / examples_ 目录中获取所有这些文件。要将此演示打包到名为 `TicTacToe.jar` 的单个 JAR 文件中，您可以从 `TicTacToe` 目录中运行此命令：

```
jar cvf TicTacToe.jar TicTacToe.class audio images

```

`音频`和`图像`参数表示目录​​，因此 Jar 工具将递归地将它们及其内容放在 JAR 文件中。生成的 JAR 文件 `TicTacToe.jar` 将放在当前目录中。因为该命令使用 `v` 选项进行详细输出，所以在运行命令时会看到类似于此输出的内容：

```
adding: TicTacToe.class (in=3825) (out=2222) (deflated 41%)
adding: audio/ (in=0) (out=0) (stored 0%)
adding: audio/beep.au (in=4032) (out=3572) (deflated 11%)
adding: audio/ding.au (in=2566) (out=2055) (deflated 19%)
adding: audio/return.au (in=6558) (out=4401) (deflated 32%)
adding: audio/yahoo1.au (in=7834) (out=6985) (deflated 10%)
adding: audio/yahoo2.au (in=7463) (out=4607) (deflated 38%)
adding: images/ (in=0) (out=0) (stored 0%)
adding: images/cross.gif (in=157) (out=160) (deflated -1%)
adding: images/not.gif (in=158) (out=161) (deflated -1%)

```

您可以从此输出中看到 JAR 文件 `TicTacToe.jar` 已压缩。 Jar 工具默认压缩文件。您可以使用 `0` （零）选项关闭压缩功能，以便命令如下所示：

```
jar cvf0 TicTacToe.jar TicTacToe.class audio images

```

例如，您可能希望避免压缩，以提高浏览器加载 JAR 文件的速度。通常可以比压缩文件更快地加载未压缩的 JAR 文件，因为消除了在加载期间解压缩文件的需要。但是，需要权衡的是，对于较大的未压缩文件，网络上的下载时间可能会更长。

Jar 工具将接受使用通配符 `*` 符号的参数。只要 `TicTacToe` 目录中没有任何不需要的文件，您就可以使用此备用命令来构造 JAR 文件：

```
jar cvf TicTacToe.jar *

```

虽然详细输出未指示它，但 Jar 工具会自动将清单文件添加到 JAR 存档中，路径名为 `META-INF / MANIFEST.MF` 。有关清单文件的信息，请参阅[使用清单文件：基础知识](manifestindex.html)部分。

在上面的示例中，归档中的文件保留了它们的相对路径名和目录结构。 Jar 工具提供 `-C` 选项，您可以使用该选项创建 JAR 文件，其中不保留已归档文件的相对路径。它以 TAR 的 `-C` 选项为模型。

例如，假设您想将 TicTacToe 演示使用的音频文件和 gif 图像放入 JAR 文件中，并且您希望所有文件都位于顶层，没有目录层次结构。您可以通过从`图像`和 `audio` 目录的父目录发出此命令来完成此操作：

```
jar cf ImageAudio.jar -C images . -C audio .

```

此命令的 `-C 图像`部分指示 Jar 工具转到`图像`目录和`。 ``后面的`指示 Jar 工具存档该目录的所有内容。 `-C 音频。` 命令的一部分然后对`音频`目录执行相同的操作。生成的 JAR 文件将具有以下目录：``

```
META-INF/MANIFEST.MF
cross.gif
not.gif
beep.au
ding.au
return.au
yahoo1.au
yahoo2.au

```

相反，假设您使用的命令不使用 `-C` 选项：

```
jar cf ImageAudio.jar images audio

```

生成的 JAR 文件将具有以下目录：

```
META-INF/MANIFEST.MF
images/cross.gif
images/not.gif
audio/beep.au
audio/ding.au
audio/return.au
audio/yahoo1.au
audio/yahoo2.au

```