【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 一般属性
- Manifest-Version 
用来定义manifest文件的版本号,比如:Manifest-Version: 1.0 - Created-By 
声明该文件的生成者,一般该属性是由jar命令行工具生成的。比如:Created-By: Apache Ant 1.5.1 - Signature-Version 
定义jar文件的签名版本号 - Class-Path 
应用程序或者类装载器使用该值来构建内部的类搜索路径 
1.2.2 应用程序相关属性
- Main-Class 
定义jar文件的入口类。该类必须是一个可运行的类,一旦定义了该属性就可以通过 java -jar x.jar来运行该jar文件。 
1.2.3 小程序(Applet)相关属性
- Extendsion-List 
该属性指定了小程序须要的扩展信息列表。列表中的每一个名字相应以下的属性 - -Extension-Name
 - -Specification-Version
 - -Implementation-Version
 - -Implementation-Vendor-Id
 - -Implementation-URL
 
1.2.4 扩展标识属性
- Extension-Name 
该属性定义了jar文件的标识,比如Extension-Name: Struts Framework。 
1.2.5 包扩展属性
- Implementation-Title 定义了扩展实现的标题
 - Implementation-Version 定义扩展实现的版本号
 - Implementation-Vendor 定义扩展实现的组织
 - Implementation-Vendor-Id 定义扩展实现的组织的标识
 - Implementation-URL : 定义该扩展包的下载地址(URL)
 - Specification-Title 定义扩展规范的标题
 - Specification-Version 定义扩展规范的版本号
 - Specification-Vendor 声明了维护该规范的组织
 - 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
【Java基础】Jar包结构结构分析和操作具体解释的更多相关文章
- build path libraries    java基础--Jar包添加到build path方式说明--01
		
摘自: http://blog.csdn.net/haolongabc/article/details/7007701 java基础--Jar包添加到build path方式说明--01 前言:这段短 ...
 - Spring 框架介绍 [Spring 优点][Spring 应用领域][体系结构][目录结构][基础 jar 包]
		
您的"关注"和"点赞",是信任,是认可,是支持,是动力...... 如意见相佐,可留言. 本人必将竭尽全力试图做到准确和全面,终其一生进行修改补充更新. 目录 ...
 - JAR包结构,META-INF/MANIFEST.MF文件详细说明[全部属性][打包][JDK]
		
转载请注:[https://www.cnblogs.com/applerosa/p/9736729.html] 常见的属性 jar文件的用途 压缩的和未压缩的 jar工具 可执行的JAR 1.创建可执 ...
 - Java基础复习笔记系列 七 IO操作
		
Java基础复习笔记系列之 IO操作 我们说的出入,都是站在程序的角度来说的.FileInputStream是读入数据.?????? 1.流是什么东西? 这章的理解的关键是:形象思维.一个管道插入了一 ...
 - Java常用jar包用途
		
Java常用jar包用途: USAGE INDEX JAR NAME USAGE 1 ASM asm-2.2.3.jar ASM字节码库 2 ASM asm-commons-2.2.3.jar ASM ...
 - (转)java 从jar包中读取资源文件
		
(转)java 从jar包中读取资源文件 博客分类: java 源自:http://blog.csdn.net/b_h_l/article/details/7767829 在代码中读取一些资源文件 ...
 - java打jar包的几种方式详解
		
经常会头疼于一个jar包是如何制作的,包括maven的打包方式,springboot的打jar包的原理,jar包稍稍有错误就会完全无法运行.在网上折腾了很久终于有些思路和步骤,在这里做个笔记 本文目录 ...
 - 杂项-Java:jar 包与 war 包介绍与区别
		
ylbtech-杂项-Java:jar 包与 war 包介绍与区别 1.返回顶部 1. 做Java开发,jar包和war包接触的挺多的,有必要对它们做一个深入的了解,特总结整理如下: 1.jar包的介 ...
 - java生成jar包
		
Java编写的application程序是否可以终于形成一个类似于exe一样的可执行文件.难道就仅仅能用命令行执行? 通常有两种.一种是制作一个可运行的JAR文件包.然后就能够像.chm文档一样双击运 ...
 
随机推荐
- MySQL中的max_connections和max_user_connections 及 MySQL服务器最大连接数的合理设置
			
max_connections 是指整个mysql服务器的最大连接数: max_user_connections 是指每个数据库用户的最大连接数,比如:虚拟主机可以用这个参数控制每个虚拟主机用户的数据 ...
 - 【技术贴】解决Mysql启动服务报错1067 进程意外终止
			
无法启动MYSQL服务错误1067 进程意外终止. 我使用2013-10-25_appserv-win32-2.6.0.exe安装的MySql,结果服务起不来. 于是细心机智的我发现,在F:\stud ...
 - 【SPOJ 2319】 BIGSEQ - Sequence (数位DP+高精度)
			
BIGSEQ - Sequence You are given the sequence of all K-digit binary numbers: 0, 1,..., 2K-1. You need ...
 - JSON数据与JavaScript对象转换
			
使用JSON时,最基本的工作就是JSON数据与JavaScript对象之间的互相转换.如浏览器 从服务器端获得JSON数据,然后转换为JavaScript对象在网页输出. SON: JavaScrip ...
 - 2.6.1 使用toast显示提示信息框
			
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout ...
 - vs2010创建和使用动态链接库(dll)
			
本文将创建一个简单的动态链接库,并编写一个应用台控制程序使用该动态链接库,并提出了与实现相关的几个问题,供初学者交流. 本文包含以下内容: 创建动态链接库项目 向动态链接库添加类 创建引用动态链接库的 ...
 - CH Round #45 能量释放
			
能量释放 CH Round #45 - alan有一些陷阱 III 题目描述 alan得到一块由个能量晶体构成的矿石,对于矿石中的每一个能量晶体,如果用化学物质刺激某一个能量晶体,就能使它释放能量. ...
 - SharePoint用户控件编写的简单介绍
			
转:http://www.it165.net/design/html/201204/1131.html 我们开发中,通常需要写各种各样的部件来实现我们的展示或者功能,下面就介绍下刚刚接触的QuickP ...
 - HDOJ --- Super Jumping! Jumping! Jumping!
			
Super Jumping! Jumping! Jumping! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 ...
 - c# 如何通过反射 获取\设置属性值
			
c# 如何通过反射 获取\设置属性值 //定义类public class MyClass{public int Property1 { get; set; }}static void Main(){M ...