原文链接:
https://www.cnblogs.com/anyehome/p/9435371.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填写内容,不会写?照着一个已有的抄不就行了。

jar命令详解的更多相关文章

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

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

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

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

  3. java之jar命令详解

    1. JAR 文件包 JAR 文件就是 Java Archive File,顾名思意,它的应用是与 Java 息息相关的,是 Java 的一种文档格式.JAR 文件非常类似 ZIP 文件——准确的说, ...

  4. jar 命令详解

    jar 是随 JDK 安装的,在 JDK 安装目录下的 bin 目录中,Windows 下文件名为 jar.exe,Linux 下文件名为 jar.它的运行需要用到 JDK 安装目录下 lib 目录中 ...

  5. Java中jar命令详解

    做项目的时候我们肯定接触过很多jar包,那么jar包是什么呢?笔者了解到jar是java archive file 的简写.从名字就可以知道,它的应用与Java息息相关.下面就详细介绍如何自己生成ja ...

  6. hbase shell基础和常用命令详解(转)

    HBase shell的基本用法 hbase提供了一个shell的终端给用户交互.使用命令hbase shell进入命令界面.通过执行 help可以看到命令的帮助信息. 以网上的一个学生成绩表的例子来 ...

  7. 常见 jar包详解

        常见 jar包详解 jar包 用途 axis.jar SOAP引擎包 commons-discovery-0.2.jar 用来发现.查找和实现可插入式接口,提供一些一般类实例化.单件的生命周期 ...

  8. javac命令详解(下)

    摘自http://blog.csdn.net/hudashi/article/details/7058999 javac命令详解(下)                             -ver ...

  9. javac命令详解(上)

    摘自http://blog.csdn.net/hudashi/article/details/7058998   javac命令详解(上)                             ja ...

随机推荐

  1. HTML布局排版5 测试某段html页面1

    除了div,常见的还有用table布局,这里直接用前面博文的页头页尾,如下面的页面的部分,是个简单的table.该页面样式,如果拖动浏览器,可以看到table和文本框总是居中,但是文本框下方那两个按钮 ...

  2. Juniper总结

    Juniper的路由器分为两个部分——RE和PFE.不过貌似大部分路由器都分为这两个部分.... Routing Engine: 当密码授权通过之后,用户就进入了RoutingEngine中,在其中可 ...

  3. pt-kill MySQL会话杀灭神器

    废话不多说,直接上例子: pt-kill --host=127.0.0.1 --user=xxx --password=xxxxxx --port=xxxx --busy-time 10 --matc ...

  4. vue 跨域简记

    0.服务端设置 app.use(function(req, res, next){ //设置跨域访问 res.header('Access-Control-Allow-Origin', '*'); r ...

  5. luffy项目搭建流程(Django前后端分离项目范本)

    第一阶段: 1.版本控制器:Git      2.pip安装源换国内源    3.虚拟环境搭建        4.后台:Django项目创建 5.数据库配置              6.luffy前 ...

  6. 使用jetpack 4.2.2对jetson tx2进行刷机

    一.前言 加班加点几天今天终于成功刷机,记录一下成功的一些过程,以方便同样卡住的朋友参考. 延续官网教程[1]中对设备的叫法,pc机称为host,tx2称为target. 二.过程 1. host相关 ...

  7. [转帖]时序数据库技术体系(二):初识InfluxDB

    时序数据库技术体系(二):初识InfluxDB https://sq.163yun.com/blog/article/169866295296581632 把生命浪费在美好事物上2018-06-26 ...

  8. 数据结构-链式栈c++

    栈的最基本特点先进后出,本文简单介绍一下用c++写的链式栈 头文件 #ifndef LINKEDSTACK_H #define LINKEDSTACK_H template<class T> ...

  9. Android--自定义Dialog style

    <style name="dialog" parent="@android:style/Theme.Dialog"> <item name=& ...

  10. Shiro简介、入门案例、web容器的集成

    目的: shiro简介 Shiro入门案例 Shiro与web容器的集成 shiro简介(中文官网:https://www.w3cschool.cn/shiro/andc1if0.html) 1.什么 ...