【转载】JAR命令详解

一、简介
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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值