jar

本文深入解析JAR文件格式,介绍其基于ZIP文件的基础结构及在Java应用中的关键作用。涵盖JAR文件的创建、更新、解压等操作,以及META-INF目录的作用,包括MANIFEST.MF、INDEX.LIST和签名文件等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 文件包中,它跟一般文件无异。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值