注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

民主与科学

独立之人格,自由之思想

 
 
 

日志

 
 

JAR文件揭密  

2011-09-14 20:20:04|  分类: JAVA基础 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
本文编辑整理自:http://www.ibm.com/developerworks/cn/java/j-jar/index.html
一、前言
JAR 文件格式以流行的 ZIP 文件格式为基础,用于将许多个文件聚集为一个文件。与 ZIP 文件不同的是,JAR 文件不仅用于压缩和发布,而且还用于部署和封装库、组件和插件程序,并可被像编译器和 JVM 这样的工具直接使用。在 JAR 中包含特殊的文件,如 manifests 和部署描述符,用来指示工具如何处理特定的 JAR。一个 JAR 文件可以用于:
A、用于发布和使用类库
B、作为应用程序和扩展的构建单元
C、作为组件、applet 或者插件程序的部署单位
D、用于打包与组件相关联的辅助资源
JAR 文件格式提供了许多优势和功能,其中很多是传统的压缩格式如 ZIP 或者 TAR 所没有提供的。它们包括:
1、安全性。可以对 JAR 文件内容加上数字化签名。这样,能够识别签名的工具就可以有选择地为您授予软件安全特权,这是其他文件做不到的,它还可以检测代码是否被篡改过。 
2、减少下载时间。如果一个 applet 捆绑到一个 JAR 文件中,那么浏览器就可以在一个 HTTP 事务中下载这个 applet 的类文件和相关的资源,而不是对每一个文件打开一个新连接。 
3、压缩。JAR 格式允许您压缩文件以提高存储效率。 
4、平台扩展。Java 扩展框架 (Java Extensions Framework) 提供了向 Java 核心平台添加功能的方法,这些扩展是用 JAR 文件打包的 (Java 3D 和 JavaMail 就是由 Sun 开发的扩展例子 )。 
5、包密封。存储在 JAR 文件中的包可以选择进行 密封,以增强版本一致性和安全性。密封一个包意味着包中的所有类都必须在同一 JAR 文件中找到。 
6、包版本控制。一个 JAR 文件可以包含有关它所包含的文件的数据,如厂商和版本信息。 
二、压缩的和未压缩
jar命令在默认情况下会压缩文件。未压缩的JAR 文件一般可以比压缩过的 JAR 文件更快地装载,因为在装载过程中要解压缩文件,但是未压缩的文件在网络上的下载时间可能更长。可以使用-0选项来不压缩,比如jar cf0 jar-file dir-name
常用的jar命令如表1:

功能命令
用一个单独的文件创建一个 JAR 文件jar cf jar-file input-file...
用一个目录创建一个 JAR 文件jar cf jar-file dir-name
创建一个未压缩的 JAR 文件jar cf0 jar-file dir-name
更新一个 JAR 文件jar uf jar-file input-file...
查看一个 JAR 文件的内容jar tf jar-file
提取一个 JAR 文件的内容jar xf jar-file
从一个 JAR 文件中提取特定的文件jar xf jar-file archived-file...
运行一个打包为可执行 JAR 文件的应用程序java -jar app.jar

关于JAR命令的更多内容请参考《JAR命令详解
三、可执行的JAR文件
   一个可执行的 jar文件是一个自包含的Java 应用程序,它存储在设置了程序主类的JAR 文件中,可以由 JVM 直接执行它而无需事先提取文件或者设置类路径。要运行存储在非可执行的JAR 中的应用程序,必须将它加入到您的类路径中,并用名字调用应用程序的主类。但是使用可执行的 JAR 文件,我们可以不用提取它或者知道主要入口点就可以运行一个应用程序。可执行 JAR 有助于方便发布和执行 Java 应用程序。
创建一个可执行 JAR 很容易,在MANIFEST.MF中指明主类就可以了。假设应用程序中的主类是默认包下的Hello,创建一个名为 MANIFEST.MF的文件,其内容为:
Manifest-Version: 1.0
Main-Class: Hello

注意第一行必须是,最后一行必须是一个回车行
然后,像这样创建 JAR 文件:
 jar cfm MANIFEST.MF Hello.jar Hello.class Util.class
现在可以用 java -jar Hello.jar命令执行Hello.jar。
四、包密封
密封JAR 文件中的一个包意味着在这个包中定义的所有类都必须在同一个 JAR 文件中找到。这使包的作者可以增强打包类之间的版本一致性。密封还提供了防止代码篡改的手段。要密封包,需要在 JAR 的 manifest 文件中为包添加一个 Name头,然后加上值为“true”的 Sealed头。与可执行的 JAR 一样,可以在创建 JAR 时,通过指定一个具有适当头元素的 manifest 文件密封一个 JAR,如下所示:
 Name: com/samplePackage/ 
 Sealed: true 
Name头标识出包的相对路径名。它以一个“/”结束以与文件名区别。Name头除了和Sealed头组合表示包封闭以外,还可以和SHA1-Digest头表示某个class文件的签名码。在 Name头后面第一个空行之前的所有头都作用于在 Name头中指定的文件或者包。在上述例子中,因为 Sealed头出现在 Name 头后并且中间没有空行,所以 Sealed头将被解释为只应用到包 com/samplePackage 上。
如果试图从密封包所在的 JAR 文件以外的其他地方装载密封包中的一个类,那么 JVM 将抛出一个 SecurityException。
五、扩展打包 
扩展为 Java 平台增加了功能,在 JAR 文件格式中已经加入了扩展机制。扩展机制使得 JAR 文件可以通过 manifest 文件中的 Class-Path指定所需要的其他 JAR 文件。
假设 extension1.jar 和 extension2.jar 是同一个目录中的两个 JAR 文件,extension1.jar 的 manifest 文件包含以下头:
 Class-Path: extension2.jar 
这个头表明 extension2.jar 中的类是 extension1.jar 中的类的 扩展类。extension1.jar 中的类可以调用 extension2.jar 中的类,并且不要求 extension2.jar 处在类路径中。
在装载使用扩展机制的 JAR 时,JVM 会高效而自动地将在 Class-Path头中引用的 JAR 添加到类路径中。不过,扩展 JAR 路径被解释为相对路径,所以一般来说,扩展 JAR 必须存储在引用它的 JAR 所在的同一目录中。
例如,假设类 ExtensionClient.jar中ExtensionClient引用了ExtensionDemo.jar 中类ExtensionDemo。为了使类ExtensionClient可以使用ExtensionDemo,必须将 ExtensionDemo.jar 列在 ExtensionClient.jar 的 manifest 的 Class-Path头中,如下所示:
 Manifest-Version: 1.0 
 Class-Path: ExtensionDemo.jar 

在这个manifest中Class-Path项没有显式指定 ExtensionDemo.jar的路径,表明 ExtensionDemo.jar 与当前JAR 文件处在同一目录中。
六、JAR文件的安全性
我们可以对JAR文件进行数字签名,以确保JAR文件的安全。关于此的详细内容请参照《Jar文件的数字签名
七、JAR索引
     如果一个应用程序或者 applet 捆绑到多个 JAR 文件中,那么类装载器就使用一个简单的线性搜索算法搜索类路径中的每一个元素,这使类装载器可能要下载并打开许多个 JAR 文件,直到找到所要的类或者资源。如果类装载器试图寻找一个其实并不存在的资源,那么在应用程序或者 applet 中的所有 JAR 文件都会下载。对于大型的网络应用程序和 applet,这会导致启动缓慢、响应迟缓并浪费带宽。从 JDK 1.3 以后,JAR 文件格式开始支持索引以优化网络应用程序中类的搜索过程,特别是 applet。JarIndex 机制收集在applet 或者应用程序中定义的所有 JAR 文件的内容,并将这些信息存储到第一个 JAR 文件中的索引文件中。下载了第一个 JAR 文件后,applet 类装载器将使用收集的内容信息高效地装载 JAR 文件。这个目录信息存储在根 JAR 文件的 META-INF目录中的一个名为 INDEX.LIST 的简单文本文件中。
可以通过在 jar 命令中指定 -i 选项创建一个 JarIndex。
假设我们Hello.jar,lib2.jar这两个jar文件。
 您将使用下述命令为 它们创建一个索引文件:
jar -i Hello.jar lib2.jar
那么在Hello.jar文件的META-INF目录下将生产一个INDEX.LIST 文件。该文件的的格式很简单,包含每个已索引的 JAR 文件中包含的包名字或默认包的类的名字,如清单 2 所示:
INDEX.LIST文件
JarIndex-Version: 1.0

Hello.jar
com
com/teleca
com/teleca/robin
hello.class

lib2.jar
com
com/robin
com/robin/META-INF
注意:INDEX.LIST文件中包含的是每个已索引的JAR 文件中包含的包名字或默认包的类的名字。该文件放在jar命令的第一个jar文件的META-INF目录下.
  评论这张
 
阅读(588)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017