一、简介
jar 是随 JDK 安装的,在 JDK 安装目录下的 bin 目录中,Windows 下文件名为 jar.exe,Linux 下文件名为 jar。它的运行需要用到 JDK 安装目录下 lib 目录中的 tools.jar 文件。不过我们除了安装 JDK 什么也不需要做,因为 SUN 已经帮我们做好了。我们甚至不需要将tools.jar 放到 CLASSPATH 中。
jar 命令语法如下:
jar {ctxu}[vfm0M] [jar-文件] [manifest-文件] [-C 目录] 文件名 ...
其中
{ctxu}
是 jar 命令的子命令,每次 jar 命令只能包含 ctxu 中的一个,它们分别表示:
-c 创建新的 JAR 文件包
-t 列出 JAR 文件包的内容列表
-x 展开 JAR 文件包的指定文件或者所有文件
-u 更新已存在的 JAR 文件包 (添加文件到 JAR 文件包中)
[
vfm0M
] 中的选项可以任选,也可以不选,它们是 jar 命令的选项参数
-v 生成详细报告并打印到标准输出
-f 指定 JAR 文件名,通常这个参数是必须的
-m 指定需要包含的 MANIFEST 清单文件
-0 只存储,不压缩,这样产生的 JAR 文件包会比不用该参数产生的体积大,但速度更快
-M 不产生所有项的清单(MANIFEST〕文件,此参数会忽略 -m 参数
[jar-文件] 即需要生成、查看、更新或者解开的 JAR 文件包,它是 -f 参数的附属参数
[manifest-文件] 即 MANIFEST 清单文件,它是 -m 参数的附属参数
[-C 目录] 表示转到指定目录下去执行这个 jar 命令的操作。它相当于先使用 cd 命令转该目录下再执行不带 -C 参数的 jar 命令,它只能在创建和更新 JAR 文件包的时候可用。在jdk1.6中,
我实验该命令失败。
文件名 ... 指定一个文件/目录列表,这些文件/目录就是要添加到 JAR 文件包中的文件/目录。如果指定了目录,那么 jar 命令打包的时候会自动把该目录中的所有文件和子目录打入包中。
二、常用实例
示例1、
jar cf Hello.jar hello.class
把当前目录的hello.class文件打包到Hello.jar,且不显示打包的过程。如果Hello.jar文件还不存在,就创建它,否则首先清空它。
示例2、
jar c
v
f Hello.jar hello.class
把当前目录的hello.class文件打包到Hello.jar,并显示打包的过程。如果Hello.jar文件还不存在,就创建它,否则首先清空它。
打包过程显示如下:
added manifest
adding: hello.class(in = 612) (out= 379)(deflated 38%)
示例3、 jar cvf Hello.jar hello.class Util.class
把当前目录的hello.class和Util.class文件打包到Hello.jar,并显示打包的过程。如果Hello.jar文件还不存在,就创建它,否则首先清空它。
示例4、 jar cvf Hello.jar *.class
把当前目录的所有class文件打包到Hello.jar,并显示打包的过程。如果Hello.jar文件还不存在,就创建它,否则首先清空它。
示例5、
jar cvf
M
Hello.jar hello.class
该命令与
示例2
结果类似,但在Hello.jar不产生MANIFEST 文件,
示例6、
jar cvfm Hello.jar manifest.mf hello.class Util.class
运行结果与
示例3
相似,只是用manifest.mf 指定了jar文件中MANIFEST文件的一些内容。
manifest.mf文件
Manifest-Version: 1.0
Main-Class: Hello
生成的jar文件中的MANIFEST文件为
Manifest-Version: 1.0
Created-By: 1.6.0_11 (Sun Microsystems Inc.)
Main-Class: Hello
示例7、
jar cvfm Test.jar
manifest.mf com\robin\*.class
把com\robin目录的所有class文件打包到Test.jar,并显示打包的过程。如果Test.jar文件还不存在,就创建它,否则首先清空它。
注意:jar命令默认是以当前目录作为class的根目录,所以对于com\robin\test.class文件,在jar解压后,test.class文件也在其解压目录的com\robin目录下。
示例8、
jar cvfm Test.jar
manifest.mf com
把com整个目录包到Test.jar,并显示打包的过程。如果Test.jar文件还不存在,就创建它,否则首先清空它。
注意:jar命令默认是以当前目录作为class的根目录,所以对于com\robin\test.class文件,在jar解压后,test.class文件也在其解压目录的com\robin目录下。
示例9、
jar tf Hello.jar
列出Hello.jar包含的文件清单.
对于
示例6生成的Hello.jar结果如下:
META-INF/
META-INF/MANIFEST.MF
hello.class
Util.class
示例10、
jar tvf Hello.jar
显现Hello.jar包含的文件的消息信息.
对于
示例6生成的Hello.jar结果如下:
0 Sun Sep 11 15:06:10 KST 2011 META-INF/
90 Sun Sep 11 15:06:10 KST 2011 META-INF/MANIFEST.MF
612 Sat Sep 10 14:53:14 KST 2011 hello.class
267 Sat Sep 10 14:53:14 KST 2011 Util.class
示例11、
jar xf Hello.jar
解压Hello.jar 到当前目录,不显示任何信息,对于
示例6
生成的 test.jar,解开后的目录结构如下:
==
|-- META-INF
| `-- MANIFEST
`-- hello.class
`-- Util.class
示例12、
jar xvf Hello.jar
与
示例11相似,只是对于解压过程有详细信息显示,如:
created: META-INF/
inflated: META-INF/MANIFEST.MF
inflated: hello.class
inflated: Util.class
三、一些技巧
3.1、使用 unzip 来解压 JAR 文件
在介绍 JAR 文件的时候就已经说过了,JAR 文件实际上就是 ZIP 文件,所以可以使用常见的一些解压 ZIP 文件的工具来解压 JAR 文件,如 Windows 下的 WinZip、WinRAR 等和 Linux 下的 unzip 等。使用 WinZip 和 WinRAR 等来解压是因为它们解压比较直观,方便。而使用 unzip,则是因为它解压时可以使用 -d 参数指定目标目录。
在解压一个 JAR 文件的时候是不能使用 jar 的 -C 参数来指定解压的目标的,因为 -C 参数只在创建或者更新包的时候可用。那么需要将文件解压到某个指定目录下的时候就需要先将这具 JAR 文件拷贝到目标目录下,再进行解压,比较麻烦
。如果使用 unzip,就不需要这么麻烦了,只需要指定一个 -d 参数即可。如:
unzip test.jar -d dest/
3.2、
使用其他工具创建JAR 文件
上面提到 JAR 文件就是包含了
META-INF/MANIFEST
的 ZIP 文件,所以,只需要使用
WinZip、WinRAR
等工具创建所需要 ZIP 压缩包,再往这个 ZIP 压缩包中添加一个包含 MANIFEST 文件的 META-INF 目录即可。
对于使用 jar 命令的 -m 参数指定清单文件的情况,只需要将这个 MANIFEST 按需要修改即可。
3.3、使用 jar 命令创建 ZIP 文件
有些 Linux 下提供unzip 命令,但没有 zip 命令,所以需要可以对 ZIP 文件进行解压,即不能创建 ZIP 文件。如要创建一个 ZIP 文件,使用带 -M 参数的 jar 命令即可,因为 -M 参数表示制作 JAR 包的时候不添加 MANIFEST 清单,那么只需要在指定目标 JAR 文件的地方将 .jar 扩展名改为 .zip 扩展名,创建的就是一个不折不扣的 ZIP 文件了,如将
示例8
略作改动:
jar cvfM test.zip com