zoukankan      html  css  js  c++  java
  • 【Java基础】Jar包结构结构分析和操作具体解释

    作者:郭嘉
    邮箱: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.0
    Created-By:1.8.0_31 (Oracle Corporation)
    Main-Class:com.allenwells.MainStart

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

    使用cvmf命令进行打包

    jar -cvmf MANIFEST.MF allenwells.jar com
  • 相关阅读:
    由Photoshop高反差保留算法原理联想到的一些图像增强算法。
    一种具有细节保留功能的磨皮算法。
    图像抠图算法学习
    一年去雾算法研究的总结。
    关于《半反去雾算法》一文的四宗罪。
    自己编码使用去色、曲线、色阶算法实现照片怀旧特效。
    基于中值滤波或双边滤波方式的图像去雾效果的研讨。
    24位真彩色图像转换为16位高彩色图像的实现方法及效果改进
    对比度保留之彩色图像去色算法---基础算法也可以上档次。
    Tone Mapping算法系列一:基于Fast Bilateral Filtering 算法的 High-Dynamic Range(HDR) 图像显示技术。
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/5328303.html
Copyright © 2011-2022 走看看