这些Java教程是针对JDK 8编写的。本页中描述的示例和实践不利用后续版本中引入的改进,并可能使用已不再可用的技术。
请参阅Java语言变更以了解Java SE 9及后续版本中的更新语言特性的概要。
请参阅JDK发行说明以获取有关所有JDK版本的新功能、增强功能以及已移除或不建议使用选项的信息。
创建JAR文件的基本格式是:
jar cf jar文件 输入文件
该命令中使用的选项和参数如下:
c和f选项可以以任意顺序出现,但它们之间不能有任何空格。
这个命令将生成一个压缩的JAR文件并将其放置在当前目录中。该命令还将为JAR归档生成一个默认清单文件。
JAR文件中的元数据,例如条目名称、注释和清单的内容,必须使用UTF8进行编码。
您可以将以下任何附加选项添加到基本命令的cf选项中:
选项 | 描述 |
---|---|
v | 在构建JAR文件时在stdout上产生详细输出。详细输出会告诉您每个文件被添加到JAR文件中的名称。 |
0(零) | 表示您不希望压缩JAR文件。 |
M | 表示不生成默认清单文件。 |
m | 用于从现有清单文件中包含清单信息。使用此选项的格式为:
jar cmf jar文件 现有清单 输入文件 警告: 清单必须以新行或回车符结束。如果最后一行没有以新行或回车符结束,最后一行将无法正确解析。 |
-C | 用于在执行命令期间更改目录。请参见下面的示例。 |
创建JAR文件时,创建时间会存储在JAR文件中。因此,即使JAR文件的内容没有改变,当你多次创建JAR文件时,生成的文件并不完全相同。在使用JAR文件的构建环境时,你应该注意这一点。建议你在清单文件中使用版本信息来控制JAR文件的版本,而不是使用创建时间。详见设置包版本信息章节。
让我们看一个例子。一个简单的TicTacToe小程序。你可以通过从Java SE Downloads下载JDK Demos和Samples bundle来查看此小程序的源代码。此演示包含有如下结构的类文件、音频文件和图片:
audio和images子目录包含了小程序使用的声音文件和GIF图片。
当你在线下载整个教程时,你可以从jar/examples目录中获取所有这些文件。要将此演示打包为一个名为TicTacToe.jar的JAR文件,你可以在TicTacToe目录内运行以下命令:
jar cvf TicTacToe.jar TicTacToe.class audio images
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的清单文件。有关清单文件的信息,请参见使用清单文件:基础知识部分。
在上面的示例中,存档中的文件保留了它们的相对路径名和目录结构。Jar工具提供了-C选项,您可以使用该选项创建一个不保留已归档文件的相对路径的JAR文件。它的模型是TAR的-C选项。
举个例子,假设您希望将TicTacToe演示中使用的音频文件和gif图像放入一个JAR文件中,并且希望所有文件都位于顶级目录,没有目录层次结构。您可以在images和audio目录的父目录中发出以下命令来实现:
jar cf ImageAudio.jar -C images . -C audio .
该命令中的-C images部分指示Jar工具进入images目录,-C images后面的.指示Jar工具将该目录的所有内容归档。命令中的-C audio .部分也是同样的操作,针对audio目录。生成的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