【Java基础】Jar包结构结构分析和操作详解

来源:互联网 发布:opencv java 高斯模糊 编辑:程序博客网 时间:2024/06/05 06:32

作者:郭嘉
邮箱:allenwells@163.com
博客:http://blog.csdn.net/allenwells
github:https://github.com/AllenWell

一 JAR包结构分析

JAR(Java Archive FIle)Java归档文件,是Java标准的文档格式,是一个或多个Java字节码文件的打包压缩文件,采用常见的ZIP压缩算法,和ZIP文件十分类似,可以直接解压。

JAR文件主要用来压缩和发布字节码文件,而且还用于部署和封装库、组件和插件程序,并且可以被像编辑器和JVM这样的工具直接使用。

1.1 JAR包结构

JAR包的结构如下图所示:

这里写图片描述

1.2 MANIFEST.MF属性

从上图可以看出,JAR包比普通zip文件多了一个META-INF文件夹,该文件夹下包含了一个MANFEST.MF文件。

1.2.1 一般属性

  1. Manifest-Version
    用来定义manifest文件的版本,例如:Manifest-Version: 1.0
  2. Created-By
    声明该文件的生成者,一般该属性是由jar命令行工具生成的,例如:Created-By: Apache Ant 1.5.1
  3. Signature-Version
    定义jar文件的签名版本
  4. Class-Path
    应用程序或者类装载器使用该值来构建内部的类搜索路径

1.2.2 应用程序相关属性

  1. Main-Class
    定义jar文件的入口类,该类必须是一个可执行的类,一旦定义了该属性即可通过 java -jar x.jar来运行该jar文件。

1.2.3 小程序(Applet)相关属性

  1. Extendsion-List
    该属性指定了小程序需要的扩展信息列表,列表中的每个名字对应以下的属性
  2. -Extension-Name
  3. -Specification-Version
  4. -Implementation-Version
  5. -Implementation-Vendor-Id
  6. -Implementation-URL

1.2.4 扩展标识属性

  1. Extension-Name
    该属性定义了jar文件的标识,例如Extension-Name: Struts Framework。

1.2.5 包扩展属性

  1. Implementation-Title 定义了扩展实现的标题
  2. Implementation-Version 定义扩展实现的版本
  3. Implementation-Vendor 定义扩展实现的组织
  4. Implementation-Vendor-Id 定义扩展实现的组织的标识
  5. Implementation-URL : 定义该扩展包的下载地址(URL)
  6. Specification-Title 定义扩展规范的标题
  7. Specification-Version 定义扩展规范的版本
  8. Specification-Vendor 声明了维护该规范的组织
  9. Sealed 定义jar文件是否封存,值可以是true或者false
      

1.2.6 签名相关属性

签名方面的属性我们可以来参照JavaMail所提供的mail.jar中的一段:

 Name: javax/mail/Address.class Digest-Algorithms: SHA MD5  SHA-Digest: AjR7RqnN//cdYGouxbd06mSVfI4= MD5-Digest: ZnTIQ2aQAtSNIOWXI1pQpw==

这段内容定义类签名的类名、计算摘要的算法名以及对应的摘要内容(使用BASE64方法进行编码)。

1.2.7 自定义属性

  除了前面提到的一些属性外,你也可以在MANIFEST.MF中增加自己的属性以及响应的值,例如J2ME程序jar包中就可能包含着如下信息

 MicroEdition-Configuration: CLDC-1.0 MIDlet-Name: J2ME_MOBBER Midlet Suite MIDlet-Info-URL: http://www.javayou.com/ MIDlet-Icon: /icon.png MIDlet-Vendor: Midlet Suite Vendor MIDlet-1: mobber,/icon.png,mobber MIDlet-Version: 1.0.0 MicroEdition-Profile: MIDP-1.0 MIDlet-Description: Communicator

  
  我们如何读取这些信息呢?
  
  JDK给我们提供了用于处理这些信息的API,我们可以通过给JarFile传递一个jar文件的路径,然后调用JarFile的getManifest方法来获取Manifest信息。

二 JAR包操作详解

2.1 JAR操作命令

JAR相关操作命令如下图所示:

这里写图片描述

如果使用参数f,就需要指定JAR文件;如果使用参数m,就需要指定manife文件;如果使用参数e,就需要指定main入口类,这些参数的指定顺序也应该和程序或入口点的指定顺序保持一致。

另外如果使用参数m,则会生成默认的清单文件,如果使用参数m,则会使用指定的文件作为清单文件,如果使用参数M,则表示不生成任何清单文件。

针对以上命令,下面做一些详细的解释:

  • -c 创建新的JAR文件包。
  • -t 列出JAR文件包的内容列表。
  • -x 展开JAR文件包的指定文件或所有文件。
  • -u 更新已存在的JAR包,对于一个已经存在的JAR包,我们任然可以向其中添加新的字节码文件或旧的字节码文件,如果已经存在路径、类名都相同的文件,则更新源文件,如果不存在,则添加该文件。清单文件也可以通过这种方式更改。
  • -v 生成详细的报告并打印到标准输出。
  • -f 指定JAR包的文件名,通常该选项是必选的。
  • -m 指定需要包含的MANIFEST.MF清单文件。
  • -O 只存储,不压缩。生成的JAR包体积大,但运行速度快。
  • -M 不产生所有项的清单文件,此参数会忽略-m选项。
  • [-C 目录] 表示转到指定目录下去执行jar命令的操作,它相当于优先使用cd命令转到指定目录下执行不带-C参数的jar命令,它只能在创建和更新JAR包的时候使用。

下面举一些具体使用的例子:

jar tvf allenwells.jar

显示allenwells.jar内包含文件的详细信息。

jar -xvf allenwells.jar

解压allenwells.jar到当前目录,并显示详细的解压过程信息。

jar cvf allenwells.jar com

将com目录下的class文件生成allenwells.jar文件,并显示打包过程,如果已经存在该文件,那么该文件会被覆盖。

jar cvfm allenwells.jar mymanifest.mf -C com/ . 

使用自定义的清单文件mymanifest.mf并将com/目录下的所有文件归档到allenwells.jar中,allenwells.jar被保存到当前目录。

jar uvf allenwells.jar manifest.mf

向allenwells.jar中添加manifest.mf文件,这里只是作为普通文件添加进去。如果指定了-m选项,那么manifest.mf会作为清单文件来使用,其内容会被添加到MANIFEST.MF中。

制作可执行Jar包

在Windoows下安装JRE的时候,安装文件会把.jar文件映射给javaw.exr打开,对于一个可执行的JAR包而言,可以直接双击打开。下面说明一下具体操作流程:

编写MANIFEST-MF文件

MANIFEST-MF文件文件内容如下所示:

Manifest-Version:1.0Created-By:1.8.0_31 (Oracle Corporation)Main-Class:com.allenwells.MainStart

可以看出,想要制作可执行JAR包,指定Main-Class是关键。

使用cvmf命令进行打包

jar -cvmf MANIFEST.MF allenwells.jar com
1 0
原创粉丝点击