在最近,因为老师要求我总结一下有关jar命令的相关知识,所以整合了许多资料,作了以下的总结:
1.
Jar
文件包:
JAR
文件就是
Java Archive File
,是
Java
的一种文档格式。
JAR
文件非常类似
ZIP
文件,更准确的说,它就是
ZIP
文件,所以叫它文件包。
JAR
文件与
ZIP
文件唯一的区别就是在
JAR
文件的内容中,包含了一个
META-INF/MANIFEST.MF
文件,这个文件是在生成
JAR
文件的时候自动创建的。
2.
创建
jar
文件包:
Jar文件包分为两类:可执行jar文件包和不可执行的jar文件包。它们的区别是jar文件包里
META-INF/MANIFEST.MF
文件是否
jar
指定了包含入口函数public static void main(String[]) 方法的
主类。至于如何编写
MANIFEST.MF
,下文会提及。
2.1
创建不可执行的
jar
文件包:
如果你创建一个
jar
文件包,仅仅用于打包你的
.class
字节码文件,不需要它们直接双击就能运行的话或者要打包一些不含主类的
.class
字节码文件,那么你可以创建不可执行的
jar
文件包。
jar cvf [jar
包文件名
] [
要打包的
.class
文件或包含全部
.class
文件的文件夹
]
例
2-1
:
jar cvf test.jar X.class Y.class
打包过后
jar
包里包含
META-INF
文件夹,而该文件夹里有
MANIFEST.MF
,这都是自动被创建的;而与
META-INF
文件夹同级目录下则包含了被打包的
X.class
和
Y.class
。
例
2-2
:
jar cvf test.jar bao
打包过后,
jar
包里包含
META-INF
文件夹,而该文件夹里有
MANIFEST.MF
,这都是自动被创建的;而与
META-INF
文件夹同级目录下则包含了文件夹
bao
。
2.2
创建可执行的
jar
文件包:
制作一个可执行的 JAR 文件包来发布你的程序是 JAR 文件包最典型的用法。
创建可执行的 JAR 文件包,需要使用带 cvfm 参数的 jar 命令(这是创建可执行jar文件包一般使用的参数,下文会对参数有详细的解释),命令的格式如下:
jar cvfm
[jar
包文件名
] manifest.mf [
要打包的
.class
文件或包含全部
.class
文件的包
]
例2-3:jar cvfm test.jar manifest.mf
X.class Y.class
打包后的目录结构与2.1相同,但是最大的区别是在jar文件包的META-INF/MANIFEST.MF中指明了主类。那么就要求我们在打包之前先创建一个自己的MANIFEST.MF。而在 MANIFEST.MF 中书写格式如下(假设X.class为主类):
Main-Class: 可执行主类全名(包含包名) <回车>
例如:Main-Class: X<回车符>
注意:MANIFEST 中书写的关键在于Main-Class:与可执行主类全名(包含包名)要留一空格,而且必须以一空行结束,即是以一个回车符结束。
除此之外,创建的 JAR 文件包中需要包含完整的、与 Java 程序的包结构对应的目录结构。而 Main-Class 指定的类,也必须是完整的、包含包路径的类名。
继续以上面为例,假设X.class和Y.class都在包bao中,并且X.class为主类
例2-4:创建jar包的命令为:
jar cvfm test.jar manifest.mf bao
而在manifest.mf 中书写为:
Main-Class: bao.X<回车符>
打包过后,
jar包里包含META-INF文件夹,而该文件夹里有MANIFEST.MF,这都是自动被创建的;而与META-INF文件夹同级目录下则包含了包bao。
运行可执行jar文件包,可直接双击jar文件包,或在命令行中输入 java –jar [要运行的jar文件包],或者创建一个.bar批处理文件,内容编辑为java –jar [要运行的jar文件包],放在与jar文件夹同一目录下,直接双击该文件也可运行
3.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命令的使用方法:
例3-1:jar cf test.jar bao
该命令没有打印压缩的执行过程,执行结果是在当前目录生成了 test.jar 文件。而且
jar包里包含META-INF文件夹,而该文件夹里有MANIFEST.MF,这都是自动被创建的;而与META-INF文件夹同级目录下则包含了文件夹bao。
例3-2
:jar cvf test.jar bao
该命令与上例中的结果相同,但是由于 v 参数的作用,显示出了打包过程。
例3-3
:jar cvfM test.jar bao
该命令与例3-2结果类似,但在生成的 test.jar 中没有包含 META-INF/MANIFEST 文件,也有打印出压缩的执行过程。
例3-4
:jar cvfm test.jar manifest.mf bao
运行结果与例3-2相似,打印信息也相同,只是生成 JAR 包中的 META-INF/MANIFEST 内容不同,是包含了 manifest.mf 的内容
例3-5
:jar tf test.jar
在 test.jar 已经存在的情况下,可以查看 test.jar 中的内容,结果如下:
META-INF/
META-INF/MANIFEST.MF
bao/
X.class
例3-6
:jar tvf test.jar
除显示中例3-5显示的内容外,还包括包内文件的详细信息,如:
0 Fri May 19 15:39:06 GMT 2010 META-INF/
86 Fri May 19 15:39:06 GMT 2010 META-INF/MANIFEST.MF
0 Fri May 19 15:39:06 GMT 2010 bao/
7 Fri May 19 15:39:06 GMT 2010 bao/X.class
例3-7
:jar xf test.jar
解压test.jar 到当前目录,不打印任何信息。
例3-8
:jar xvf test.jar
解压test.jar 到当前目录,打印解压过程的详细信息。
例3-9
:jar uf test.jar Y.class
在 test.jar 中添加了文件Y.class
例3-10
:jar uvf test.jar Y.class
与例3-9结果相同,同时有详细信息显示。