自解压的jar实现原理

原创 2004年02月09日 15:53:00
 

自解压的jar实现原理

作者:Turbo Chen

日期:2004/2/8

    在网络上,有些java程序的提供者将他们的java安装程序打包成一个jar文件的形式。当运行时,自动将jar中的程序解压出来安装到使用者的电脑上。他们是如何做到这些的呢?现在我们就来解开这个迷,让大家了解如果制作这样的jar文件。

    首先,我们来回忆一下,以前我们打包jar时,通常将class程序要用到的资源如*.gif图片、*.xml配置文件等都打包在同一个jar中。而程序读取它们时,无外乎以下几种情况:

getClass().getResource(String name)
getClass().getresourceAsStream(String name)

由于Class的这两个方法实际上就是调用了ClassLoader的相应方法,所以可以干脆用下面的方法:

ClassLoader.getSystemClassLoader().getResource(String name)
ClassLoader.getSystemClassLoader().getResourceAsStream(String name)

getResource可以取得相关资源的URL, 这在使用图片资源时很有用。而getResourceAsStream可以取得资源的输入流,这个通常在读取jar中的xml配置文件时用到。

其实讲到这里我们就可以明白那些可以自动解压安装的jar是怎么一回事了----它就是使用了getresourceAsStream方法。

下面我们来详细描述怎么实现一个通用的自动解压安装的jar程序。

为了使这个程序尽可能的通用,我将它设计成下面的结构:

figure.jpg

Resource包含要安装的资源的信息,通过getName方法可以取得资源名称,通过getDistPath方法要被安装的路径。相应的resourceCollectioin是Resource的集合。

InstallConfig是要安装资源的配置信息,为了通用的目的,将资源配置信息写入一名为install-config.xml的文件。InstallConfig初始化时,会载入配置文件中的信息。将其实例化成Resource集合:

 ... InputStream input = ClassLoader.getSystemClassLoader().getResourceAsStream(CONFIG); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document configDoc = builder.parse(input); Element eConfig = (Element) configDoc.getElementsByTagName(
"install-config").item(0); resourceBase = eConfig.getAttribute("resourcebase"); NodeList eResources = configDoc.getElementsByTagName("resource"); for ( int i=0;inew Resource(eResource.getAttribute("name"),PathUtil.replaceAll(eResource.getAttribute("dist"))); resSet.addResource(res); } ...

相关的install-config.xml文件格式如下:

<

install-config resourcebase="res/">

    <resource name="testA.txt" dist="${user.dir}/"/>

    <resource name="testB.txt" dist="c:/"/>

< FONT>install-config>

其中
resourcebase 是要安装资源在jar中的基准位置。
name 是资源名。
dist: 是资源将被安装到的目标目录。
目录支持三种类型的环境变量,分别是:
${user.dir} 是用户程序运行的路径。
${user.home} 是用户的主目录,对于window2000用户来说,它位于C:/Documents and Settings/Administrator。
${java.home} 是JRE安装的主目录。

**注意:对于目录名,必须以"/"分隔,并以"/"结尾。

 

AutoInstaller是主程序,它读取InstallConfig中的资源配置信息,并负责这些资源的自动解压和安装的工作,实现的代码很简单:

程序实现起来非常简单,关键是打包时,各个文件的位置,以下再来个例子说明一下:

 [myProj] [src] install-config.xml [dist] [res] 在此目录结构是,myProj是我项目的主目录,src是本文源程序位置,install-config.xml也在其中。 dist是打包后的目录位置。 res是我们要进行自动解压安装的相关文件的位置,所有要安装的文件就在其中,我提供的build.xml可以自动将其打进包内。 

为配合此程序,我另外制作了方便打包的ant编译脚本文件build.xml,在我文后提供的下载包有详细的用法说明。欢迎大家下载使用。

下载全部源文件

 

 

 

实现Java代码压缩解压

原因:某个时间想对服务器上的zip中的某些文件进行修改 本来以为很简单的事情,在网上找了好些代码,结果效果都不是很理想。 实现对象:对各种类型的文件夹(包含子文件或子文件夹) 下...
  • stven_king
  • stven_king
  • 2015年04月02日 16:26
  • 1409

GZIP压缩原理分析(08)——第四章 基于gzip的HTTP压缩详解(四02) 原理

经过压缩的HTTP应答报文是由浏览器解压的,用wireshark抓包可以看到客户端主机接收到的HTTP应答报文仍然是压缩的,而且wireshark可以将该HTTP应答解压(是否让wireshark解压...
  • jison_r_wang
  • jison_r_wang
  • 2016年07月30日 10:15
  • 1244

哈夫曼压缩原理及其简单实现

1、原理 首先要了解一下哈夫曼树即最优二叉树的概念,就是给每个叶子节点一个权值,构建一颗二叉树,使得权值乘以叶子节点到跟节点的和值最小,那么这棵树就       是最优二叉树。下面就是建立一棵二叉树...
  • u011091632
  • u011091632
  • 2014年04月01日 20:19
  • 2505

怎样制作自解压jar文件

这是一篇描述怎样制作自解压jar文件的文章,作者通过自己编写的一个自解压程序,并把这个自解压程序以及一个manifest文件一起加入原始的jar文件中,就制作出一个可以在各种支持java的平台上运行的...
  • tomora
  • tomora
  • 2013年09月15日 10:27
  • 684

VC实现自解压

  • 2014年09月05日 08:44
  • 48KB
  • 下载

VC++实现自解压

  • 2014年09月05日 08:42
  • 542KB
  • 下载

用Linux makeself制作自解压的可执行程序

前言: 日常工作中我们需要把Linux操作系统下一堆文件或者脚本制作成一个可执行程序,发布后别人只要拿到这个程序就会把它整体运行起来。比起一般的把文件(夹)压缩打包,然后把压缩包发给别人,再告诉别人解...
  • tonyhuang_google_com
  • tonyhuang_google_com
  • 2016年06月16日 15:27
  • 1220

详解WinRar的自解压路径及命令

在使用winrar打包时,需要将文件复制到系统根目录,但是为了保证兼容性,需要使用系统变量,在网上查了下,得到以下资料,发于此以备后用。           WINRAR 的帮助文件中没有对自解...
  • setflvet
  • setflvet
  • 2011年11月22日 20:04
  • 13286

shell下制作自解压安装包

原理阐述 在linux下可以用几个最基本的命令制作一个自解压的程序。其原理是:利用cat 命令可以将两个文件连起来(用>>追加也能达到同样效果),前一个文件是shell脚本,负责执行解压和安装;后...
  • superbfly
  • superbfly
  • 2014年09月01日 11:20
  • 969

winrar 制作自解压exe

  • u011072140
  • u011072140
  • 2017年03月29日 16:16
  • 123
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:自解压的jar实现原理
举报原因:
原因补充:

(最多只允许输入30个字)