【liunx】Linux下的压缩和解压缩命令——jar

原文链接:
http://blog.chinaunix.net/uid-692788-id-2681136.html
JAR 包是 Java 中所特有一种压缩文档, 其实大家就可以把它理解为.zip 包。当然也是有区别的,JAR 包中有一个 META-INF\MANIFEST.MF 文件, 当你找成 JAR 包时, 它会自动生成。
JAR 包是由 JDK 安装目录 \bin\jar.exe 命令生成的,当我们安装好 JDK,设置好 path 路径,就可以正常使用 jar.exe 命令,它会用 lib\tool.jar 工具包中的类。这些细节就不用管它了。
让我们看看它怎么使用吧:
 

一.    jar命令选项:

jar 命令格式:jar {c t x u f}[v m e 0 M i][-C 目录] 文件名...
 
其中 {ctxu} 这四个选项必须选其一。[v f m e 0 M i]是可选选项,文件名也是必须的。
-c  创建一个 jar 包
-t  显示 jar 中的内容列表
-x  解压 jar 包
-u  添加文件到 jar 包中
-f  指定 jar 包的文件名
-v  生成详细的报造,并输出至标准设备
-m  指定 manifest.mf 文件.(manifest.mf 文件中可以对 jar 包及其中的内容作一些一设置)
-0  产生 jar 包时不对其中的内容进行压缩处理
-M  不产生所有文件的清单文件 (Manifest.mf)。这个参数与忽略掉 -m 参数的设置
-i    为指定的 jar 文件创建索引文件
-C  表示转到相应的目录下执行 jar 命令, 相当于 cd 到那个目录,然后不带 -C 执行 jar 命令
二.  jar使用范例:

(1) 创建 jar 包
$ jar cf hello.jar hello   利用 test 目录生成 hello.jar 包, 如 hello.jar 存在, 则覆盖
 
(2) 创建并显示打包过程
$ jar cvf hello.jar hello     利用 hello 目录创建 hello.jar 包, 并显示创建过程
例:E:\>jar cvf hello.jar hello
标明清单 (manifest)
增加:hello/(读入 = 0) (写出 = 0)(存储了 0%)
增加:hello/TestServlet2.class(读入 = 1497) (写出 = 818)(压缩了 45%)
增加:hello/HelloServlet.class(读入 = 1344) (写出 = 736)(压缩了 45%)
增加:hello/TestServlet1.class(读入 = 2037) (写出 = 1118)(压缩了 45%)
 
(3) 显示 jar 包
$ jar tvf hello.jar    查看 hello.jar 包的内容
指定的 jar 包必须真实存在,否则会发生 FileNoutFoundException。
 
(4) 解压 jar 包
$ jar xvf hello.jar   解压 hello.jar 至当前目录
 
(5)jar 中添加文件
$ jar uf hello.jar HelloWorld.java     将 HelloWorld.java 添加到 hello.jar 包中
 
(6) 创建不压缩内容 jar 包
$ jar cvf0 hello.jar *.class      利用当前目录中所有的.class 文件生成一个不压缩 jar 包
 
(7) 创建带 manifest.mf 文件的 jar 包
$ jar cvfm hello.jar manifest.mf hello
创建的 jar 包多了一个 META-INF 目录,META-INF 止录下多了一个 manifest.mf 文件, 至于 manifest.mf 的作用, 后面会提到.
 
(8) 忽略 manifest.mf 文件
$ jar cvfM hello.jar hello    生成的 jar 包中不包括 META-INF 目录及 manifest.mf 文件
 
(9) 加 -C 应用:
$ jar cvfm hello.jar mymanifest.mf -C hello/
表示在切换到 hello 目录下然后再执行 jar 命令
 
(10)-i 为 jar 文件生成索引列表
当一个 jar 包中的内容很好的时候,你可以给它生成一个索引文件,这样看起来很省事。
$ jar  i  hello.jar     
执行完这条命令后,它会在 hello.jar 包的 META-INF 文件夹下生成一个名为 INDEX.LIST 的索引文件,
它会生成一个列表,最上边为 jar 包名。
 
(11) 导出解压列表
jar tvf hello.jar >hello.txt   
如果你想查看解压一个 jar 的详细过程,而这个 jar 包又很大,屏幕信息会一闪而过,
这时你可以把列表输出到一个文件中,慢慢欣赏!
 
(12)jar -cvf hello.jar hello/*
   例如原目录结构如下:
   hello
     |---com
     |---org
 
 你本想只把 com 目录和 org 目录打包,而这时 jar 命令会连同 hello 目洋也一块打包进。
这点大家要注意。jar 命令生成的压缩文件会包含它后边出的目录。我们应该进入到 hello 目录再执行 jar 命令。
 
注意:manifest.mf 这个文件名,用户可以任指定,但 jar 命令只认识 Manifest.mf,它会对用户指定的文件名进行相应在的转换,这不需用户担心。

 

三.Manifest.mf文件编写规则:

manifest.mf 的编写一定要注意一些细节,它是很苛刻的,
我在此也载过不少跟头,谁让它这么小气呢,没办法,所以专门给大家列出来。
 
(1) 不能有空行和空格的地方
    第一行不可以是空行 (第一行的行前不可以有空行),行与行之间不能有空行,第行的行尾不可以有空格
(2) 一定要有空行的地方
最后一行得是空行 (在输完你的内容后加一个回车就 OK)
(3) 一定有空格的地方
     key: value       在分号后面一定要写写一个空格
 

四.怎样使用 jar包中的类

还是写个小例子吧,这样直观!
   public final class Person
   {
              public static int age()
              {
                     return 30;
              }
   }
-> javac Person.java
->jar cvf person.jar Person.class   将上面的文件打成一个 jar 包
再写一个类对其进行调用:
   public class MyAge
   {
              public static void getAge()
        {
                     System.out.println(Person.age());
              }
   }
 
  ->javac  MyAge.java
  ->java -classpath person.jar MyAge
 
************ 调试一下这个程序 *******************
 

五.创建可执行 jar

有时自己写个程序,类一大堆,时间一长连自己都不知道那个是主类,
而且有可能用到图片或其它文件一大堆,看得也乱,
这时你可以考虑把它做成一个可执行 jar 包...
 
  (1) 编辑 manifest.mf 文件加入下面一行
     Main-Class: MyApplet
    
     注意:Main-Class 的大小定,冒号后的空格,MyApplet 后一定输入回车,然后保存。
 
  (2) 打包
     jar cvfm FirstApplet.jar manifest.mf MyApplet.class
     注意:manifest.mf 指定为存放 Mani-Class: MyApplet 文件的文件名
 
   (3) 可执行 jar 的使用
      java -jar FirstApplet.jar
      或
      也可以中使用:
 
   注意:类并没有给出,大家随便写一个就行,类名包名自己随意定,相应的更改就可以...
 

六.扩展自己的类

在 JDK 的安装目录 \jre\lib\ext 目录下,SUN 为大家为我们扩展自己类的提供了方便,
大家可以将自己的类文件打成.jar 包放在此目录下,它由 ExtClassLoader 类装器负责进行装载,
ExtClassLoader 类装器是 AppClassLoader 类装载器的父装载器,AppClassLoader 主要负责加载 CLASSPATH 路径下的文件,
而在 java 中采用的又是委托父装载器的机制,所以此目录下存放的 jar 中的类文件不做任何的设置,
类装载器就可以找到正常的加载,是不是很方便啊,呵...
 
如果你的.jar 是给 applet 小应用程序看的,可以在打成 jar 包之前,在其 manifest.mf 加入下面两行。
  Class-Path: FirstApplet.jar
  Class-path: SecondApplet.jar
  Main-Class: MyApplet
 
  注意:Class-path 可以设置多项,直接写 jar 包名既可。
Main-Class 主要当 jar 中有多个.class 类文件时,java 并不知道那个才是主类,
所以要指定,如果 jar 包中只有一个类当然可以不指定。
 
Java 调用类的顺序:java\lib\ext 中的类 --->Manifest.mf 中指定的类 --> 当前目录中的类 -->set CLASSPATH 中指定的类。
 

七.调用 URL网络上的 jar

(1) 生成 jar 包的 URL
   URL u=new URL("jar:"+"FirstAppplet.jar"+!/");
 
(2) 建立 jarURLConnection 对象
   JarURLConnection juc=(JarURLConnection)u.openConnection();
 
(3) 返回 jar 包中主类的名字
Attributes attr=juc.getMainAttributes();
String name=attr.getValue("Mani-Class");
 
一定要确保你的 jar 包中的 manifest.mf 中已正确的设置了 Mani-Class 属性,再强调一下一定要注意规则。
 
(4) 根据得到的主类名创建 Class 对象
   Class c=Class.forName(name);
 
(5) 根据 Class 对象调用其 main 方法:
   Method cm=c.getMethod("main",new Class[]{String.class});
   cm.invoke(null,new Object[]{});
 
  ************* 如何调用 ***************
 
提示: 上边用到了 Reflection 反射机制的相关知识,大家如果多反射机制有兴趣,可查看 java.lang.reflect 包中的相关内容.
 

八.JAR命令使用技巧:

 
(1) jar 创建压 ZIP 文件
jar cvfM TestZIP.jar test        加 M 参数为了不生成 META-INF 相关内容
然后将 TestZIP.jar 改为 TestZIP.zip 就可以,是不是很简单....
 
(2) 使用 WinRAR 解压.jar 文件
上边我们已经说过了,说 JAR 文件是一种特殊的压缩文件,所以它当然可以用我们常用的一些解压缩工具来解了,
至于怎么解,这就不用我说了吧。
 
(3) 用 WinRAR 生成.jar 文件
     我们已经说过 JAR 包与 ZIP 包主要区别就是 JAR 包中多一个 META-INF 的目录,
META-INF 目录下有一个 manifest.mf 文件,我们只要建立好相关的目录一压缩就可以了。
目录的结构如下:
      TestJar
          |--META-INF
                |--manifest.mf
          |-- 相关的类文件
 
注意:还应该在 manifest.mf 填写内容,不会写?照着一个已有的抄不就行了。