零基础学Java第2版
上QQ阅读APP看书,第一时间看更新

2.4 jar文件的创建与查看

本节将详细介绍如何实现最常用的打包方法。包括创建.jar文件、查看jar文件的内容、提取jar文件的内容、更新jar文件和运行打包的jar软件。通过本章的学习,了解Java中jar工具的真正意义与功能。

说明

如果读者采用完全自学,可以先忽略本节的内容,直接跳到第2.5节学习,等用到jar的时候再回来学习。

2.4.1 创建jar文件

创建.jar文件的基本命令格式为:

jar cf jar-file input-file(s)

其中每个选项或参数的含义如下:

❑jar:启动JDK的jar工具。

❑c:该选项表示此时调用jar工具的目的是创建一个jar文件。

❑jar-file:该选项表示打包的结果文件名,该文件生成后有.jar扩展名,该文件的名称没有要求,只要便于理解记忆即可。可以在创建jar文件时就在jar-file后添加.jar扩展名,默认不用添加扩展名。

❑input-file(s):该参数表示添加到jar文件中的文件。该参数可以包含通配符*,也可以包含目录(一个或多个),如果是目录则把目录下的所有文件依次打包进jar文件。

命令jar cf会在当前目录下生成一个经过压缩的jar文件,并且产生一个默认的manifest文件,该文件会列出jar文件中的所有文件。

还有一些选项可以添加到cf选项之间,这些选项及其含义如表2.2所示。

表2.2 jar工具选项以及含义

在了解了如何创建基本的jar文件和各种选项之后,下面通过一个创建jar文件的例子,来更具体地学习jar工具的具体实现方式和各种参数的含义。

【实例2.1】笔者设计了一个类MyJarTest,该类需要音频资源和图片资源,把该文件打包成一个jar文件,这样就可在任何平台上运行该程序。该程序和资源放在目录MyJarTest目录下,文件结构如图2.6所示。

图2.6 MyJarTest目录结构

说明

因为此时读者还没有学习类的知识,这里只是给出一个大概的过程让读者了解打包jar文件的流程,不需要读者亲自动手。如果读者不感兴趣,可以直接跳过2.4节。

其中包含两个子目录myaudio和myimages,这两个子目录中包含程序所需要的音频和图像信息。下面需要把上述文件打包成名为MyJarTest.jar的文件,首先在DOS窗口中转到MyJarTest目录下,在当前目录下输入打包的命令格式如下:

Jar cvf MyJarTest.jar MyJarTest.class myaudio myimages

说明

因为myaudio和myimages是目录,所以Jar工具会迭代地访问这些文件夹并把文件夹中的文件添加到MyJarTest.jar文件中。因为使用了cvf选项,所以在打包的过程中会显示添加文件的内容。最后生成的MyJarTest.jar文件存储在当前目录下。图2.7是创建压缩的jar文件。

图2.7 创建压缩的jar文件

从图2.7中可以看出创建该jar文件中的文件都经过了压缩处理,并显示了压缩比例,如果不需要压缩处理而创建不经过压缩的jar文件,可以选择0参数。

Java的jar工具提供了非压缩的打包参数,是因为考虑到实际应用中的效率。如当用户下载Applet肯定不希望过长的传输时间,如果该Applet采用压缩过的jar文件,使用户在下载之前先解压压缩文件,再经过网络传输到客户端,这样就比较耗时,而采用不经过压缩Applet的jar文件就减少了解压缩的时间。创建非压缩的jar文件的命令格式如下所示。

Jar cvf0 MyJarTest.jar MyJarTest.class myaudio myimages

输出结果如图2.8所示,这是创建未压缩的jar文件。

图2.8 创建未压缩的jar文件

刚才讲过Jar工具也接受使用*通配符的参数,如果在当前目录下的所有文件都需要打包就可以使用通配符,它表示在当前目录下的所有文件都需要打包成jar文件。可以采用如下的命令方式创建jar文件。

Jar cvf MyJarTest.jar *

该命令的执行结果与图2.8相似,只是向MyJarTest.jar中添加的文件数量不同。

上述例子中,在jar文件中附带了打包文件自己的路径名和目录结构。在查看jar文件时会清楚地看到这一点,如图2.9所示。

说明

这里使用了查看jar文件内容的命令jar tf jar-file.jar,读者不必关注其具体含义,关键是观察文件的内容,注意文件的目录结构。

Jar工具提供了一个-C选项,使创建的jar文件不保存被打包文件的相关路径名。

下面举例说明,假设用户想把音频文件和图像文件创建为一个jar文件,并且该jar文件中的所有文件没有目录结构,即所有文件在最高层的同一目录下。可以使用如下命令完成上述任务:

Jar cf ImageAudio.jar -C myimages . -C myaudio .

参数-C myimages告诉Jar工具进入myimages路径,随后告诉Jar工具将该目录下的所有文件打包。参数-C myaudio告诉Jar工具进入myaudio路径,随后告诉Jar工具将该目录下的所有文件打包。在参数-C、myimages和.之间必须有空格。为了显示压缩过程,这里使用cvf参数。执行结果如图2.10所示。

图2.9 查看MyJarTest.jar文件内容

图2.10 使用-C参数压缩并打包文件

在ImageAudio.jar创建成功后,该jar文件的内容列表如图2.11所示。此时调用了查看jar文件的命令jar tf jar-file.jar。输出如图2.11所示。

注意

图2.11中使用了查看jar文件内容的命令jar tf jar-file.jar,该命令显示jar文件的内容,注意这里没有文件的目录结构,所有文件在一个目录中。

如果没有采用-C选项将音频文件和图像文件打包成jar文件,则该jar文件的内容为具有目录结构的文件列表。使用命令jar cf ImageAudio.jar myimages myaudio来打包文件并使用jar tf ImageAudio.jar查看文件内容。文件内容列表如图2.12所示。

图2.11 查看ImageAudio.jar内容

图2.12 查看带目录结构的ImageAudio.jar

2.4.2 查看jar文件的内容

查看文件的基本操作命令如下所示。

jar tf jar-file.jar

下面分析一下该命令的各参数或选项的含义。

❑t选项说明查看jar文件的内容列表。

❑f选项指明需要查看的jar文件必须在命令行中说明。

❑jar-file参数是需要查看的jar文件的路径和名字。

说明

选项t和f的顺序可以互换,但是在二者之间不能有空格。上述命令的作用是jar文件的内容列表显示在标准输出装置。也可以在tf之间增加v选项来产生关于文件长度、修改时间等的额外信息,并显示在标准输出装置上。

【实例2.2】下面通过具体的例子说明如何查看jar文件的内容,以及显示结果。使用Jar工具查看ImageAudio.jar文件的内容,注意这里的ImageAudio.jar文件是带目录结构的。命令格式如下:

jar tf ImageAudio.jar

该命令将ImageAudio.jar中的文件内容显示在标准输出中。图2.13显示查看ImageAudio.jar文件的内容。

说明

从输出结果看,该ImageAudio.jar文件包含myimages和myaudio目录下的文件,并且从输出结果前两行可以看出该jar文件包含了默认的manifest文件,META-INF/MANIFEST.MF,该文件有JAR工具在创建jar文件时自动产生。

图2.13中所有的路径名都是以“pathname/”形式出现,该路径永远是以相对路径的方式出现,无论操作系统平台是Windows、Linux或者Mac,这里的路径名肯定不会出现绝对路径。

采用选项v会显示jar文件中所有文件的最后修改时间,命令格式如下所示。

jar tvf ImageAudio.jar

命令的输出结果如图2.14所示,通过选项cvf查看ImageAudio.jar内容。

图2.13 查看ImageAudio.jar文件内容

图2.14 通过选项cvf查ImageAudio.jar内容

2.4.3 提取jar文件的内容

提取文件jar文件内容的命令格式如下所示。

jar xf jar-file [archived-file(s)]

下面分析该命令的参数或选项含义。

❑x选项说明提取jar文件的内容。

❑f选项指明需要提取的jar文件必须在命令行中说明。

❑jar-file参数是需要提取的jar文件的路径和名字。

❑archived-file(s)是可选参数,包含从jar-file中提取的文件的列表,如果没有该可选项,则默认是提取jar-files中的所有文件。

说明

选项x和f的顺序可以互换,但是在二者之间不能有空格。当执行提取文件操作时,Jar工具复制想要提取的文件,并把复制的文件存储在当前目录下,重新建立目录结构。而原始的jar文件内容不发生变化。

【实例2.3】下面通过具体的例子说明如何提取jar文件的相关子文件。命令格式如下:

jar xf ImageAudio.jar

在图2.14中已经看到了ImageAudio.jar文件中的内容,为了方便分析,这里再给出该文件的内容。

mETA-INF/
mETA-INF/MANIFEST.MF
myimages;
myimages/T4.gif
myimages/T10.gif
myimages/T2.gif
myimages/T3.gif
myimages/T2.gif
myaudio/
myaudio/mid_warn.wav
myaudio/mid_info.wav
myaudio/mid_err.wav

假设想从ImageAudio.jar文件中提取T2.gif和mid_warn.wav两个文件,可以采用如下命令格式:

Jar xf ImgeAudio.jar myimages/T2.gif myaudio/mid_warn.wav

该命令做两件事:

❑复制目录myimages下的T2.gif和myaudio目录下的mid_warn.wav文件。

❑如果文件夹myimages或myaudio不存在则创建新文件夹,并把文件T2.gif放入myimages文件夹,把mid_warn.wav放入myaudio文件夹。

说明

因为ImageAudio.jar文件是带目录结构的,所以在提取文件时必须告诉Jar工具文件的相对位置,否则无法提取想要的文件。无论如何,原始的ImageAudio.jar不会发生任何变化。

读者可以以相同的方式提取任何类型的文件,当然前提是该文件在jar文件中存在,所以要求读者在提取文件前先使用命令jar tf jar-file来查看文件内容。

而如果没有指定要提取的文件名称,则默认是提取所有的jar文件中的内容,并重建文件目录。读者可以通过如下命令体验该功能:

Jar   xf ImageAudio.jar

2.4.4 更新jar文件

Jar工具提供了u参数向已经存在的jar文件中增加新的文件,其基本命令格式如下所示。

jar uf jar-file.jar input_file(s)

下面分析该命令的参数或选项的含义。

❑u选项说明需要更新jar文件的内容列表。

❑f选项指明需要更新的jar文件必须在命令行中说明。

❑jar-file参数是需要更新的jar文件。

❑input_file(s)表示需要增加到jar文件中的文件列表。

说明

如果增加的文件在jar文件中已经存在,则新文件会覆盖掉原来的文件。

【实例2.4】下面举例说明如何向已经存在的jar文件中增加新文件。请读者再回忆一下ImageAudio.jar的内容:

mETA-INF/
mETA-INF/MANIFEST.MF
myimages;
myimages/T4.gif
myimages/T10.gif
myimages/T2.gif
myimages/T3.gif
myimages/T2.gif
myaudio/
myaudio/mid_warn.wav
myaudio/mid_info.wav
myaudio/mid_err.wav

假设想要向该jar文件中增加一个mid_dd.wav文件,首先在mid_dd.wav文件所在目录下执行如下命令:

Jar uf ImageAudio.jar mid_confirm.wav

再次查看ImageAudio.jar的文件内容则如下所示。

META-INF/
META-INF/MANIFEST.MF
myimages/
myimages/T4.gif
myimages/T10.gif
myimages/T2.gif
myimages/T3.gif
myimages/T2.gif
myaudio/
myaudio/mid_warn.wav
myaudio/mid_info.wav
myaudio/mid_err.wav
mid_confirm.wav

注意

在更新后的jar文件中增加了一个文件,该文件在文件列表的最后一行显示。文件mid_confirm.wav放在ImageAudio.jar文件目录结构的根目录下。

如果想添加的文件在文件夹newaudio中,也可以在该文件夹的直接上级目录中使用-C选项,指定目录,然后进入目录寻找想添加的文件。如下命令所示。

jar uf ImageAudio.jar -C newaudio mid_confirm.wav

该命令的作用是向ImageAudio.jar文件中添加一个音频文件,Jar工具需要在当前目录的newaudio目录下继续搜索名为mid_confirm.wav的文件。

以上介绍了Jar工具的各种使用方式,这里对Jar工具参数含义做个总结:

jar {ctxu}[vfm0Mi] [jar-文件] [manifest-文件] [-C 目录] 文件名 ...

选项含义:

❑-c 创建新的存档。

❑-t 列出存档内容的列表。

❑-x 展开存档中的命名的(或所有的)文件。❑-u 更新已存在的存档。

❑-v 生成详细输出到标准输出上。

❑-f 指定存档文件名。

❑-m 包含来自标明文件的标明信息。

❑-o 只存储方式,未用ZIP压缩格式。

❑-M 不产生所有项的清单(manifest)文件。

❑-i 为指定的jar文件产生索引信息。

❑-C 改变到指定的目录。

说明

如果一个文件名是一个目录,它将被递归处理。清单(manifest)文件名和存档文件名都需要被指定,按“m”和“f”标志指定的顺序相同。

2.4.5 运行打包的jar软件

至此,读者已经学习过了如何创建jar文件,提取jar文件的内容,向jar文件中添加文件,以及查看jar文件的内容。本节将介绍如何运行打包的应用程序,以及jar文件在Applet中的应用。考虑以下两种情形:

❑jar文件包含Applet,该Applet在浏览器中运行。

❑jar文件包含应用程序,该应用程序通过命令行启动。

下面依次介绍这两种jar文件的应用方式。

1. jar文件包含Applet

为了激活Applet,使该Applet可以在浏览器中运行,使用Applet标签来表示在HTML中的Applet程序。如果该Applet与jar文件相关联,则需要使用Archive参数说明jar文件的相对路径。一个Applet的例子如下所示。

<applet code = MyJarTest.class
               Width=100 height=100>
</applet>

如果需要的程序被打包成名为MyJarTest.jar的jar文件,则可以通过调用Applet标签Archive的方式说明调用了一个jar文件,并说明该jar文件的相对目录。

<applet code = MyJarTest.class
               Archive="MyJarTest.jar"
               Width=100 height=100>
</applet>

参数Archive表示包含类MyJarTest.class的jar文件的相对路径,本例中该jar文件和html文件在相同的目录中,如果在读者的程序中二者的路径不同,则需要修改jar文件的相对路径。如果该jar文件在html文件所在目录的下级目录myjar目录中,则该Applet应该做如下修改。

applet code = MyJarTest.class
              Archive="myjar/MyJarTest.jar"
              Width=100 height=100>
</applet>

2. jar文件包含应用程序

首先介绍如何打包应用程序。在前面介绍了如何将各种文件打包然后统一发布,但是对于应用程序来讲,这有些区别。在运行打包的jar应用程序前必须确保运行环境,知道该jar文件中的哪个类是程序的入口。

所以,为了说明哪个类是应用程序的入口,必须在该jar文件的manifest文件中增加一个Main-Class头信息。其格式如下所示。

Main-Class: MainClassName

其中MainClassName是作为应用程序入口的类名。下面通过一个具体的例子说明如何打包可运行的jar应用程序。

例如笔者把MyJarTest类作为应用程序的入口,首先需要创建一个名为Manifest.txt的文本文件,在文件内输入如下内容:

Main-Class: MyJarTest

注意

在Manifest.txt文本文件内的头信息必须以回车或换行结束,否则无法解析,在完成了上述文件的设置后,执行如下命令。

jar cfm MyJar.jar Manifest.txt MyJarTest.class myaudio myimages

此时完成了应用程序的打包,该应用程序打包后的jar文件名字是MyJar.jar,并且告知了运行环境应用程序执行的入口。接下来执行如下命令执行该应用程序。

Java -jar MyJar.jar