3. jar 命o详解
jar 是随 JDK 安装的,?JDK 安装目录下的 bin 目录中,Windows 下文件名?jar.exeQLinux 下文件名?jar。它的运行需要用?JDK 安装目录?lib 目录中的 tools.jar 文g。不q我们除了安?JDK 什么也不需要做Q因?SUN 已经帮我们做好了。我们甚至不需要将 tools.jar 攑ֈ CLASSPATH 中?
使用不带M?jar 命o我们可以看到 jar 命o的用法如下:
jar {ctxu}[vfm0M] [jar-文g] [manifest-文g] [-C 目录] 文g?...
其中 {ctxu} ?jar 命o的子命oQ每?jar 命o只能包含 ctxu 中的一个,它们分别表示Q?
-c 创徏新的 JAR 文g?
-t 列出 JAR 文g包的内容列表
-x 展开 JAR 文g包的指定文g或者所有文?
-u 更新已存在的 JAR 文g?(d文g?JAR 文g包中)
[vfm0M] 中的选项可以任选,也可以不选,它们?jar 命o的选项参数
-v 生成详细报告q打印到标准输出
-f 指定 JAR 文g名,通常q个参数是必ȝ
-m 指定需要包含的 MANIFEST 清单文g
-0 只存储,不压~,q样产生?JAR 文g包会比不用该参数产生的体U大Q但速度更快
-M 不生所有项的清单(MANIFEST〕文Ӟ此参C忽略 -m 参数
[jar-文g] 即需要生成、查看、更新或者解开?JAR 文g包,它是 -f 参数的附属参?
[manifest-文g] ?MANIFEST 清单文gQ它?-m 参数的附属参?
[-C 目录] 表示转到指定目录下去执行q个 jar 命o的操作。它相当于先使用 cd 命o转该目录下再执行不带 -C 参数?jar 命oQ它只能在创建和更新 JAR 文g包的时候可用。
文g?... 指定一个文?目录列表Q这些文?目录是要添加到 JAR 文g包中的文?目录。如果指定了目录Q那?jar 命o打包的时候会自动把该目录中的所有文件和子目录打入包中?
下面举一些例子来说明 jar 命o的用法:
1) jar cf test.jar test
该命令没有执行过E的昄Q执行结果是在当前目录生成了 test.jar 文g。如果当前目录已l存?test.jarQ那么该文g被覆盖?
2) jar cvf test.jar test
该命令与上例中的l果相同Q但是由?v 参数的作用,昄Z打包q程Q如下:
标明清单(manifest)
增加Qtest/(d= 0) (写出= 0)(存储?0%)
增加Qtest/Test.class(d= 7) (写出= 6)(压羃?14%)
3) jar cvfM test.jar test
该命令与 2) l果cMQ但在生成的 test.jar 中没有包?META-INF/MANIFEST 文gQ打包过E的信息也略有差别:
增加Qtest/(d= 0) (写出= 0)(存储?0%)
增加Qtest/Test.class(d= 7) (写出= 6)(压羃?14%)
4) jar cvfm test.jar manifest.mf test
q行l果?2) 怼Q显CZ息也相同Q只是生?JAR 包中?META-INF/MANIFEST 内容不同Q是包含?manifest.mf 的内?
5) jar tf test.jar
?test.jar 已经存在的情况下Q可以查?test.jar 中的内容Q如对于 2) ?3) 生成?test.jar 分别应该此命令,l果如下Q?
对于 2)
META-INF/
META-INF/MANIFEST.MF
test/
test/Test.class
对于 3)
test/
test/Test.class
6) jar tvf test.jar
除显C?5) 中显C的内容外,q包括包内文件的详细信息Q如Q?
0 Wed Jun 19 15:39:06 GMT 2002 META-INF/
86 Wed Jun 19 15:39:06 GMT 2002 META-INF/MANIFEST.MF
0 Wed Jun 19 15:33:04 GMT 2002 test/
7 Wed Jun 19 15:33:04 GMT 2002 test/Test.class
7) jar xf test.jar
解开 test.jar 到当前目录,不显CZQ何信息,对于 2) 生成?test.jarQ解开后的目录l构如下Q?
==
|-- META-INF
| `-- MANIFEST
`-- test
`--Test.class
jar xvf test.jar
q行l果?7) 相同Q对于解压过E有详细信息昄Q如Q?
创徏QMETA-INF/
展开QMETA-INF/MANIFEST.MF
创徏Qtest/
展开Qtest/Test.class
9) jar uf test.jar manifest.mf
?test.jar 中添加了文g manifest.mfQ此使用 jar tf 来查?test.jar 可以发现 test.jar 中比原来多了一?manifest。这里顺便提一下,如果使用 -m 参数q指?manifest.mf 文gQ那?manifest.mf 是作为清单文?MANIFEST 来用的Q它的内容会被添加到 MANIFEST 中;但是Q如果作Z般文件添加到 JAR 文g包中Q它跟一般文件无异?
10) jar uvf test.jar manifest.mf
?9) l果相同Q同时有详细信息昄Q如Q?
增加Qmanifest.mf(d= 17) (写出= 19)(压羃?-11%)
4. 关于 JAR 文g包的一些技?
1) 使用 unzip 来解?JAR 文g
在介l?JAR 文g的时候就已经说过了,JAR 文g实际上就?ZIP 文gQ所以可以用常见的一些解?ZIP 文g的工h解压 JAR 文gQ如 Windows 下的 WinZip、WinRAR {和 Linux 下的 unzip {。?WinZip ?WinRAR {来解压是因为它们解压比较直观,方便。而?unzipQ则是因为它解压时可以?-d 参数指定目标目录?
在解压一?JAR 文g的时候是不能使用 jar ?-C 参数来指定解压的目标的,因ؓ -C 参数只在创徏或者更新包的时候可用。那么需要将文g解压到某个指定目录下的时候就需要先这?JAR 文g拯到目标目录下Q再q行解压Q比较麻烦。如果?unzipQ就不需要这么麻烦了Q只需要指定一?-d 参数卛_。如Q?
unzip test.jar -d dest/
2) 使用 WinZip 或?WinRAR {工具创?JAR 文g
上面提到 JAR 文g是包含?META-INF/MANIFEST ?ZIP 文gQ所以,只需要?WinZip、WinRAR {工具创建所需?ZIP 压羃包,再往q个 ZIP 压羃包中d一个包?MANIFEST 文g?META-INF 目录卛_。对于?jar 命o?-m 参数指定清单文g的情况,只需要将q个 MANIFEST 按需要修改即可?
3) 使用 jar 命o创徏 ZIP 文g
有些 Linux 下提供了 unzip 命oQ但没有 zip 命oQ所以需要可以对 ZIP 文gq行解压Q即不能创徏 ZIP 文g。如要创Z?ZIP 文gQ用带 -M 参数?jar 命o卛_Q因?-M 参数表示制作 JAR 包的时候不d MANIFEST 清单Q那么只需要在指定目标 JAR 文g的地方将 .jar 扩展名改?.zip 扩展名,创徏的就是一个不折不扣的 ZIP 文g了,如将上一节的W?3) 个例子略作改动:
jar cvfM test.zip test