JAR 文件 ?
JAR 文件格式以流行的 ZIP 文件格式为基础,用于将许多个文件聚集为一个文件。与 ZIP 文件不同的是, JAR 文件不仅用于压缩和发布,而且还用于部署和封装库、组件和插件程序,并可被像编译器和 JVM 这样的工具直接使用。在 JAR 中包含特殊的文件,如 manifests 和部署描述符,用来指示工具如何处理特定的 JAR 。
jar 工具在默认情况下压缩文件。未压缩的 JAR 文件一般可以比压缩过的 JAR 文件更快地装载,因为在装载过程中要解压缩文件,但是未压缩的文件在网络上的下载时间可能更长。
META-INF 目录
大多数 JAR 文件包含一个 META-INF 目录,它用于存储包和扩展的配置数据,如安全性和版本信息。 Java 2 平台识别并解释 META-INF 目录中的下述文件和目录,以便配置应用程序、扩展和类装载器:
- MANIFEST.MF 。 这个 manifest 文件 定义了与扩展和包相关的数据。
- INDEX.LIST 。 这个文件由 jar 工具的新选项 -i 生成,它包含在应用程序或者扩展中定义的包的位置信息。它是 JarIndex 实现的一部分,并由类装载器用于加速类装载过程。
- xxx .SF 。 这是 JAR 文件的签名文件。占位符 xxx 标识了签名者。
- xxx .DSA 。 与签名文件相关联的签名程序块文件,它存储了用于签名 JAR 文件的公共签名。
MANIFEST.MF 文件几个重要属性
Manifest-Version: 1.0
Main-Class: ui.JFrameMain
Class-Path: jtds-1.2.jar c3p0-0.9.1.2.jar esri_mo20.jar esri_mo20res.jar jsde83_sdk.jar
解释一下:
Manifest-Version mf 文件版本号,没什么,只是个版本标记
Main-Class 包含 main 函数的类,程序的入口
Class-Path 用到的一些包,这个很重要,也还好使,只要设置这个,就可以不用把第三方包在 OS 设置什么 classpath 了
要注意的地方:
要点 1 :每行的“ : ” ( 冒号 ) 用来分隔键值对,冒号后边一定要跟一个空格!
也就是说务必写为 :
Main-Class:( 空格 )YouClassName
Class-Path:( 空格 )Class1.Jar
要点 2 : Class-Path 里边的内容用空格分隔而不是逗号或者分号
也就是说务必写成 :
Class-Path:( 空格 )Class1.jar( 空格 )Class2.jar( 空格 )Class3.Jar 切记
要点 3 : 有的文章说 MF 文件每行不能超过七十多的字符,不知是否属实,没试过,但如果在一行多了我们还是采用多行,这样修改起来会方便点,但要注意以下两点:
1. 每行的最后一个 jar 的名称后不容许有空格
即 " lib/b.jar" 在 b.jar 后必须回车结束本行,不能有空格,一个都不能
2. 每行的开头必须有不少于 2 个空格
即 " lib/b.jar" 在 b.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 文件包中的文件 / 目录。如果指定了目录,那么 jar 命令打包的时候会自动把该目录中的所有文件和子目录打入包中。
下面举一些例子来说明 jar 命令的用法:
1) jar cvf test.jar test
该命令没有执行过程的显示,执行结果是在当前目录生成了 test.jar 文件。如果当前目录已经存在 test.jar ,那么该文件将被覆盖。
2) jar cvfM test.jar test
该命令与 1) 结果类似,但在生成的 test.jar 中没有包含 META-INF/MANIFEST 文件,打包过程的信息也略有差别
3) jar cvfm test.jar manifest.mf test
运行结果与 2) 相似,显示信息也相同,只是生成 jar 包中的 META-INF/MANIFEST 内容不同,是包含了 manifest.mf 的内容
4) jar tvf test.jar
在 test.jar 已经存在的情况下,可以查看 test.jar 中的内容
5) jar xvf test.jar
解开 test.jar 到当前目录,解压过程有详细信息显示
6) jar uvf test.jar manifest.mf
在 test.jar 中添加了文件 manifest.mf ,此使用 jar tf 来查看 test.jar 可以发现 test.jar 中比原来多了一个 manifest 。这里顺便提一下,如果使用 -m 参数并指定 manifest.mf 文件,那么 manifest.mf 是作为清单文件 MANIFEST 来使用的,它的内容会被添加到 MANIFEST 中;但是,如果作为一般文件添加到 jar 文件包中,它跟一般文件无异。