jar 命令详解

  jar 是随 JDK 安装的,在 JDK 安装目录下的 bin 目录中,Windows 下文件名为 jar.exe,Linux 下文件名为 jar。它的运行需要用到 JDK 安装目录下 lib 目录中的 tools.jar 文件。不过我们除了安装 JDK 什么也不需要做,因为 SUM 已经帮我们做好了。我们甚至不需要将 tools.jar 放到 CLASSPATH 中。

  使用不带任何的 jar 命令我们可以看到 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 文件包的时候可用。
  文件名 ... 指定一个文件/目录列表,这些文件/目录就是要添加到 JAR 文件包中的文件/目录。如果指定了目录,那么 jar 命令打包的时候会自动把该目录中的所有文件和子目录打入包中。

关于JAR 文件包

  JAR 文件就是 Java Archive File,顾名思意,它的应用是与 Java 息息相关的,是 Java 的一种文档格式。JAR 文件非常类似 ZIP 文件,准确的说,它就是 ZIP 文件,所以叫它文件包。JAR 文件与 ZIP 文件唯一的区别就是在 JAR 文件的内容中,包含了一个 META-INF/MANIFEST.MF 文件,这个文件是在生成 JAR 文件的时候自动创建的。举个例子,如果我们具有如下目录结构的一些文件:

  ==
  `-- test
    `-- Test.class

  把它压缩成 ZIP 文件 test.zip,则这个 ZIP 文件的内部目录结构为:

  test.zp
  `-- test
    `-- Test.class

  如果我们使用 JDK 的 jar 命令把它打成 JAR 文件包 test.jar,则这个 JAR 文件的内部目录结构为:

  test.jar
  |-- META-INF
  |  `-- MANIFEST.MF
  `-- test
    `--Test.class

  下面举一些例子来说明 jar 命令的用法:

  1) jar cf test.jar test

  该命令没有执行过程的显示,执行结果是在当前目录生成了 test.jar 文件。如果当前目录已经存在 test.jar,那么该文件将被覆盖。

  2) jar cvf test.jar test

  该命令与上例中的结果相同,但是由于 v 参数的作用,显示出了打包过程,如下:

  标明清单(manifest)
  增加:test/(读入= 0) (写出= 0)(存储了 0%)
  增加:test/Test.class(读入= 7) (写出= 6)(压缩了 14%)

  3) jar cvfM test.jar test

  该命令与 2) 结果类似,但在生成的 test.jar 中没有包含 META-INF/MANIFEST 文件,打包过程的信息也略有差别:

  增加:test/(读入= 0) (写出= 0)(存储了 0%)
  增加:test/Test.class(读入= 7) (写出= 6)(压缩了 14%)

  4) jar cvfm test.jar manifest.mf test

  运行结果与 2) 相似,显示信息也相同,只是生成 JAR 包中的 META-INF/MANIFEST 内容不同,是包含了 manifest.mf 的内容

  5) jar tf test.jar

  在 test.jar 已经存在的情况下,可以查看 test.jar 中的内容,如对于 2) 和 3) 生成的 test.jar 分别应该此命令,结果如下;

  对于 2)

  META-INF/
  META-INF/MANIFEST.MF
  test/
  test/Test.class

  对于 3)

  test/
  test/Test.class

  6) jar tvf test.jar

  除显示 5) 中显示的内容外,还包括包内文件的详细信息,如:

     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 到当前目录,不显示任何信息,对于 2) 生成的 test.jar,解开后的目录结构如下:

  ==
  |-- META-INF
  |  `-- MANIFEST
  `-- test
    `-- Test.class

  8) jar xvf test.jar

  运行结果与 7) 相同,对于解压过程有详细信息显示,如:

   创建:META-INF/
  展开:META-INF/MANIFEST.MF
   创建:test/
  展开:test/Test.class

  9) jar uf test.jar manifest.mf

  在 test.jar 中添加了文件 manifest.mf,此使用 jar tf 来查看 test.jar 可以发现 test.jar 中比原来多了一个 manifest。这里顺便提一下,如果使用 -m 参数并指定 manifest.mf 文件,那么 manifest.mf 是作为清单文件 MANIFEST 来使用的,它的内容会被添加到 MANIFEST 中;但是,如果作为一般文件添加到 JAR 文件包中,它跟一般文件无异。

  10) jar uvf test.jar manifest.mf

  与 9) 结果相同,同时有详细信息显示,如:

  增加:manifest.mf(读入= 17) (写出= 19)(压缩了 -11%)

4. 关于 JAR 文件包的一些技巧

  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/    dest目录如果不存在会自动创建

  2) 使用 WinZip 或者 WinRAR 等工具创建 JAR 文件

  上面提到 JAR 文件就是包含了 META-INF/MANIFEST 的 ZIP 文件,所以,只需要使用 WinZip、WinRAR 等工具创建所需要 ZIP 压缩包,再往这个 ZIP 压缩包中添加一个包含 MANIFEST 文件的 META-INF 目录即可。对于使用 jar 命令的 -m 参数指定清单文件的情况,只需要将这个 MANIFEST 按需要修改即可。

  3) 使用 jar 命令创建 ZIP 文件

  有些 Linux 下提供了 unzip 命令,但没有 zip 命令,所以需要可以对 ZIP 文件进行解压,即不能创建 ZIP 文件。如要创建一个 ZIP 文件,使用带 -M 参数的 jar 命令即可,因为 -M 参数表示制作 JAR 包的时候不添加 MANIFEST 清单,那么只需要在指定目标 JAR 文件的地方将 .jar 扩展名改为 .zip 扩展名,创建的就是一个不折不扣的 ZIP 文件了,如将上一节的第 3) 个例子略作改动:

  jar cvfM test.zip test

JAR命令使用的更多相关文章

  1. jar命令的用法详解

    本文详细讲述了JAR命令的用法,对于大家学习和总结jar命令的使用有一定的帮助作用.具体如下: JAR包是Java中所特有一种压缩文档,其实大家就可以把它理解为.zip包.当然也是有区别的,JAR包中 ...

  2. 转:linux下jar命令与jar包

    原文链接:http://blog.chinaunix.net/uid-692788-id-2681136.htmlJAR包是Java中所特有一种压缩文档,其实大家就可以把它理解为.zip包.当然也是有 ...

  3. 使用jar 命令生成.jar遇到的问题(绝对路径)

    最近学java遇到一个问题:在使用命令行编译jar包的时候 出现了jar包里面的结构是一个电脑的绝对路径(把jar包变成zip格式后看到的) 之所以出现这个问题一个是以为 jar包会自己识别其相对路径 ...

  4. 利用jar命令打包和解压

    常常在网上看到有人询问:如何把 java 程序编译成 .exe 文件.通常回答只有两种,一种是制作一个可执行的 JAR 文件包,然后就可以像.chm 文档一样双击运行了:而另一种是使用 JET 来进行 ...

  5. Java——jar命令

    把*.class压缩成一个文件,这样的文件就称为jar文件. 如果想要生成jar文件,直接使用JDK中bin目录里的jar.exe就可以将所有的类文件进行压缩. 当用户得到一个jar文件后,即可通过设 ...

  6. Java jar命令 常见用法

    一.jar命令作用: 进行打包 -- 把多个文件打包成一个压缩包 -- 这个压缩包和Winzip的压缩格式是一样的. 区别在于jar压缩的文件默认多一个META-INF的文件夹,该文件夹下包含一个Ma ...

  7. 如何用jar命令对java工程进行打包

    如何用jar命令对java工程进行打包 有时候为了更方便快捷的部署和执行Java程序,要把java应用程序打包成一个jar包.而这个基础的操作有时候也很麻烦,为了方便java程序员们能够方便的打包ja ...

  8. [转] - JAR文件包及jar命令详解 ( MANIFEST.MF的用法 )

    常常在网上看到有人询问:如何把 java 程序编译成 .exe 文件.通常回答只有两种,一种是制作一个可执行的 JAR 文件包,然后就可以像. chm 文档一样双击运行了:而另一种是使用 JET 来进 ...

  9. 使用JAR命令打EAR包

    恩,我又得了一个发布应用的活,常常使用JAR命令来打EAR包,所以下面记录一下,以免忘记! 前提条件如下: 1)我的WEB服务器是WebLogic Server (版本是: 10.3.6.0) 2)假 ...

  10. 把java文件打包成.jar (jar命令详解)

    把java文件打包成.jar (jar命令详解) 先打开命令提示符(win2000或在运行框里执行cmd命令,win98为DOS提示符),输入jar Chelp,然后回车(如果你盘上已经有了jdk1. ...

随机推荐

  1. JAVA中@SuppressWarnings注解的作用

    eclipse中开发JAVA代码时,经常会出现编译告警符号,影响代码可读性,也影响调试的断点符号正常显示,可以使用@SuppressWarnings注解来抑制这些告警符号的再现.1.抑制单个类型的告警 ...

  2. linux的性能优化

    转一位大神的笔记. linux的性能优化: 1.CPU,MEM 2.DISK--RAID 3.网络相关的外设,网卡 linux系统性能分析: top:linux系统的负载,CPU,MEM,SWAP,占 ...

  3. RAC8——scan ip的理解

    SCAN概念 先介绍一下什么叫SCAN,SCAN(Single Client Access Name)是Oracle从11g R2开始推出的,客户端可以通过SCAN特性负载均衡地连接到RAC数据库.S ...

  4. 日志挖掘(logminer)

    转. 如何使用logminer分析Oracle   联机日志         笔者在工作中经常遇到这样的情况:为了追踪数据的变化,需要知道某个表或者表中的某行数据是什么时候被修改的,以及修改前的内容. ...

  5. MySQL中drop,truncate 和delete的区别

    注意:这里说的delete是指不带where子句的delete语句 相同点: truncate和不带where子句的delete, 以及drop都会删除表内的数据 不同点: truncate和 del ...

  6. 如何调试触发器-MSSQL (转帖)

    调试触发器 //------------------------------------- 作者:四海为圈(原创) //------------------------------------- 1. ...

  7. ML(4): 决策树分类

    决策树(Decision Tree)是用于分类和预测的主要技术,它着眼于从一组无规则的事例推理出决策树表示形式的分类规则,采用自顶向下的递归方式,在决策树的内部节点进行属性值的比较,并根据不同属性判断 ...

  8. dede 添加自定义函数

    include/extend.func.php里添加函数 function GetTopTags($str){$dsql = new Dedesql(false);$row = $dsql->G ...

  9. BASIC-12_蓝桥杯_十六进制转八进制

    总结: 1.使用库函数可有效节省空间,但时间花费较多; 2.由于本题的输入数据较大,又限制时间,故要注意利用空间换时间; 3.使用顺序结构换取最小运行时间; 示例代码: #include <st ...

  10. BASIC-5_蓝桥杯_查找整数

    示例代码: #include <stdio.h>#include <stdlib.h> int main(void){ int n = 0 , key = 0 , count ...