本文大部分内容参考疯狂java讲义一书。仅仅作为自身学习,查缺补漏之用,如有转载请把本书名附上。
JAR文件的全称是Java Archive File,意思就是Java档案文件。通常JAR文件是一种压缩文件,与常见的ZIP压缩文件兼容,同城也被称为JAR包。JAR文件与zip文件的去区别就是在JAR文件中默认包含了一个名为META-INF/MANIFEST.MF的清单文件,这个清单文件是在生成JAR文件时系统自动创建的。
当开发了一个应用程序后,这个应用程序包含了很多类,如果需要把这个应用程序提供给别人使用,通常会将这些类文件打包成一个JAR文件,把这个JAR文件提供给别人使用。只要别人在系统的CLASSPATH环境变量中添加这个JAR文件,则Java虚拟机就可以自动在内存中解压这个JAR包,把这个JAR文件当成一个路径,在这个路径中查找所于晓的类或宝层次对应的路径结构。
使用JAR文件有以下好处:
jar包可以有一个特殊的/META-INF/MANIFEST.MF文件来指定Main-Class
把一个JAR文件添加到系统的classpath环境变量中后,Java将会把这个jar文件当成一个路径来处理。实际上jar文件就是一个路径,jar文件通常使用jar命令压缩而成,当使用jar命令压缩生成jar文件时,可以把一个或者多个路径全部压缩成一个jar文件。
jar是随jkd自动安装的,在jdk安装目录下的bin目录中,windows下文件名为jar.exe, Linux下文件名为jar。运行它需要用到jdk安装目录下lib目录中的tools.jar文件,通常系统会自动加载tools.jar,无须显示配置。
如果下命令行窗口运行不带任何参数的jar命令,系统将会提示jar命令的用法,提示信息如果图所示
该明林没有显示圧缩过程,执行结果是将当期那路径下的test路径下的全部内容生成一个test.jar文件,如果当前目录中已经存在test.jar文件,那么该文件将被覆盖。
该命令的结果与第一个命令相同,但是由于v参数的作用,显示出了打包过程
该命令的结果与第二个命令类似,其中M选项表明不生成清单文件(其实这种方式和zip文件没什么两样了,只是文件后缀不一样而已)。因此生成的test.jar中没有包含 MEAT-INF/MANIFEST.MF文件,打包过程的信息也略有差别
运行结果与第二个命令相似,显示信息也相同,其中m选项指定读取用户清单文件信息,因此在生成的jar包中清单文件META-INF/MANIFEST.MF的内容有所不同,它会在原有清单文件基础上增加MANIFEST.MF文件的内容
当开发者向MANIFEST.MF清单文件中增加自己的内容时,就需要借助于自己的清单文件了,清单文件只是一个普通的文本文件,使用记事本编辑即可。清单文件的内容由如下格式的多个Key-value对组成。
key:<空格>value
清单文件的内容格式要求如下:
可以将上面文件保存在任意位置,以任意文件名存放。例如将上面文件保存在当前路径下,文件名为a.txt.使用如下命令即可将清单文件中的Key-value对提取到META-INF/MANIFEST.MF文件中。
jar cvfm test.jar a.txt test
在test。jar文件已经存在的前提下,使用此命令可以查看test.jar中的内容。例如,对使用第二个命令生成的test.jar执行此文件,结果如下:
META-INF/
META-INF/MANIFEST.MF
test/
test/Test.class
test/Test.java
另外考虑到很多命令不是很实用,那么下面只列出部分命令的写法,具体就不解释了,详情可以参考疯狂java一书236页
当一个应用程序开发成功后,大致有三种发布方式。
java package.MainClass
当用户点击上面的批处理文件时,系统将执行批处理文件的java命令,从而运行程序的主类。如果不想保留运行java程序的命令行窗口,也可以在批处理文件中定义如下命令:
start javaw package.MainClass
把应用程序压缩成jar包来发布是比较典型的做法,如果开发者把整个应用制作成一个可执行的jar包交给用户,那么用户使用起来就方便了。在windows下安装jre时,安装文件会将.jar文件映射成由javaw.exe打开。对于一个可执行的jar包,用户只需要双击它就可以运行程序了,和阅读.chm文档一样方便(*. chm文档默认是由hh.exe打开的)。下面介绍如何制作可执行的jar包。
创建可执行的jar包的关键在于:让javaw命令知道jar包中哪个类是主类,javaw命令可以通过运行该主类来运行程序。
jar命令有一个-e选项,该选项指定jar包中作为程序入口的主类的类名。因此,制作一个可执行的jar包只要增加-e选项即可,例如如下命令:
jar cvfe test.jar test.Test test
上面命令把test目录下的所有文件都压缩到test.jar包中,并指定使用test.Test类(如果主类带包名,此处必须指定完整类名)作为程序的入口。
运行上面的jar包邮两种方式。
当创建jar包时,所有的类都必须放在与包结构对应的目录结构中,就像上面-e选项指定的Test类,表明入口类为Test。因此,必须在jar包下包含Test.class文件。
jar文件前面已经说过,实际上就是zip文件,所以可以使用一些常见的解压缩工具来解压缩jar文件,如windows下的winrar、winzip等,以及linux下的unzip等,使用winrar和winzip等工具比使用jar命令更加直观、方便;而使用unzip则可以通过-d选项来指定目标目录。
解压缩一个jar文件时不能使用jar的-C选项来指定解压的目标目录,因为=C选项只在创建或者更新包时可用,如果需要将文件加压缩到指定目录下,则需要先将jar文件拷贝到目标目录下,再进行解压缩。如果使用unzip,就无需这么麻烦了,只需要指定一个-d选项即可。例如
unzip test.jar -d dest/
使用winra则更加方便(这也就是为什么上面的命令被我省略了一大部分的原因,因为我们大概有很多时候是用win系统来进行开发的)
如果不喜欢jar命令的字符界面,也可以使用winrar工具来创建jar包。因为winrar工具创建压缩文件时不会自动添加清单文件,所以需要手动添加清单文件,即需要手动简历META-INF路径,并在该路径下简历一个MANIFEST.MF文件,该文件中至少需要如下两行:
Mainfest-Version:1.0
Created-By: 1.8.0(Oracle Corporation)
上面的MANIFEST.MF文件是一个格式敏感的文件,该文件的格式要求与前面自定义清淡的格式要求完全一样。
接下来选中需要被压缩的文件、文件夹和META-INF文件夹,单击右键弹出右键菜单,单击“添加到压缩文件(A)”菜单项,填入压缩后的文件名和指定压缩成ZIP格式,然后点确定,这样一样与使用jar命令生成的jar包没有任何区别。
除此之外,java还可能生成两种压缩包:WAR包和EAR包。其中WAR文件是Web Archive File.它对应一个web应用文档;而EAR文件就是Enterprise Archive File,它对应于一个企业应用文档(通常由web应用和EJB两个部分组成)实际上,war包和ear包的压缩格式以及压缩方式与jar包完全一样,只是改变了文件后缀而已。