Jar的定义
首先套用百度百科对Jar的解释:Jar(Java Archive,Java 归档文件)是与平台无关的文件格式,它允许将许多文件组合成一个压缩文件。为 J2EE 应用程序创建的 Jar文件是 Ear 文件(企业 Jar 文件)。Jar 文件不仅用于压缩和发布,而且还用于部署和封装库、组件和插件程序,并可被像编译器和 JVM 这样的工具直接使用。在 Jar 中包含特殊的文件,如manifests和部署描述符,用来指示工具如何处理特定的 Jar。
Jar 文件格式提供了许多优势和功能,其中很多是传统的压缩格式如 Zip所没有提供的。它们包括:
² 安全性可以对文件内容加上数字化签名。这样,能够识别签名的工具就可以有选择地为您授予软件安全特权,这是其他文件做不到的,它还可以检测代码是否被篡改过。
² 减少下载时间 如果一个 applet 捆绑到一个 Jar 文件中,那么浏览器就可以在一个 HTTP 事务中下载这个 applet 的类文件和相关的资源,而不是对每一个文件打开一个新连接。
² 压缩 Jar 格式允许您压缩文件以提高存储效率。
² 传输平台扩展 Java 扩展框架 (Java Extensions Framework) 提供了向 Java 核心平台添加功能的方法,这些扩展是用 Jar文件打包的。
² 包密封 存储在 Jar 文件中的包可以选择进行 密封,以增强版本一致性和安全性。密封一个包意味着包中的所有类都必须在同一 Jar 文件中找到。
² 包版本控制 一个 Jar 文件可以包含有关它所包含的文件的数据,如厂商和版本信息。
² 可移植性 处理 JAR 文件的机制是 Java 平台核心 API 的标准部分。
Jar的文件结构
Jar文件的结构是什么样的呢,让我们看一下Java运行时的基础类库rt.jar的解压后截图:
Jar文件与 Zip文件唯一的区别就是在 Jar 文件的内容中,包含了一个 META-INF/MANIFEST.MF 文件,这个文件是在生成 Jar 文件的时候自动创建的。如上图中的2号区域。里面多了一个MANIFEST.MF文件,这个文件描述了该Jar的很多作息(包括Jar文件的入口类、类路径和版本等),下图是ant.jar的MANIFEST.MF文件的内容截图(点击了解更多关于MANIFEST.MF):
Jar命令的用法
Jar命令相信对于Java攻城狮而言应该不陌生。
1.创建Jar包并显示打包过程 jar cvf Jar文件名称需要打包的目录或是文件
我本地项目simplecd截图如下:
我想把src下面的所有文件打成一个名为simplecd的Jar包,运行cmd进入编译后的目录F:\workspace\simplecd\WebContent\WEB-INF\classes,执行jar cvf simplecd.jar .
注意最后面的“.”代表当前文件夹,如果有子目录,它会对其进行递归处理。
2.显示指定Jar包中的内容,即Jar包中的文件列表,用上面生成的simplecd.jar包来做实验,运行jar vtf simplecd.jar,运行结果如下:
3.解压Jar包,当然我们也可以用解压缩工具如winrar来解压。但是如果我们电脑上没有装呢,那我们就可以用:jar xvf simplecd.jar运行结果如图:
如果我们只想提取Jar包的某一个文件,那么我们可以运行jar xf simplecd.jar Test.class
4.往已知Jar包中添加文件,当我们需要往Jar包中添加一些新的功能时,可以把新编译后的文件加进原来的 Jar包,
如在原来的simplecd.jar中加入对字符串、日期和数字的工具类,如下图:
我们可以进入刚才打包好的Jar包目录,运行: jar uvf simplecd.jar -C F:\workspace\test\bin .运行结果如下图:
然后我们运行jar vtf simplecd.jar结果如下图:
很明显,我们刚才新编译的三个Class文件已经加进来了。
5.创建一个Jar索引(JarIndex)Jar i simplecd.jar运行以后,我们就可以在simplecd.jar中的目录META-INF下面找到一个INDEX.LIST
里面的内容如下(包含每个已索引的 Jar 文件中包含的包或者类的名字):
那么JarIndex出现的意义是什么呢?它有什么作用呢?
网上找了一个牛人的解释:
如果一个应用程序或者 applet 捆绑到多个 Jar文件中,那么类装载器就使用一个简单的线性搜索算法搜索类路径中的每一个元素,这使类装载器可能要下载并打开许多个 Jar 文件,直到找到所要的类或者资源。如果类装载器试图寻找一个不存在的资源,那么在应用程序或者 applet 中的所有 Jar文件都会下载。对于大型的网络应用程序和 applet,这会导致启动缓慢、响应迟缓并浪费带宽。
从 JDK 1.3 以后,Jar文件格式开始支持索引以优化网络应用程序中类的搜索过程,特别是 applet。JarIndex 机制收集在 applet 或者应用程序中定义的所有 JAR 文件的内容,并将这些信息存储到第一个 JAR 文件中的索引文件中。下载了第一个 Jar文件后,applet 类装载器将使用收集的内容信息高效地装载 Jar 文件。这个目录信息存储在根 Jar文件的 META-INF 目录中的一个名为 INDEX.LIST 的简单文本文件中。
6.创建执行的Jar文件,如果我们要把Jar包打成可执行的话,得指定Main-Class即运行时的主类,拿上面项目为例,运行
jar cvfme simplecd.jar manifest.txt me.simplecd.SimpleCD -C F:\workspace\simp
lecd\WebContent\WEB-INF\classes .
运行完成后,在C盘根目录下面就生成了simplecd.jar文件:
接下来我们可以运行命令:java –jar simplecd.jar来运行这个jar包:
我们看到指定的SimpleCD类正在运行。
通过以上的学习,你是否对jar命令可以运用自如了呢,如果有什么疑问或是文章中有什么遗漏之处,可以联系QQ:442983562,当然也可以交流下java学习心得,欢迎交流分享。