自解压的jar实现原理
2004-02-09 15:53
501 查看
自解压的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程序。
为了使这个程序尽可能的通用,我将它设计成下面的结构:
Resource包含要安装的资源的信息,通过getName方法可以取得资源名称,通过getDistPath方法要被安装的路径。相应的resourceCollectioin是Resource的集合。
InstallConfig是要安装资源的配置信息,为了通用的目的,将资源配置信息写入一名为install-config.xml的文件。InstallConfig初始化时,会载入配置文件中的信息。将其实例化成Resource集合:
<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中的资源配置信息,并负责这些资源的自动解压和安装的工作,实现的代码很简单:
下载全部源文件
作者: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程序。
为了使这个程序尽可能的通用,我将它设计成下面的结构:
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中的资源配置信息,并负责这些资源的自动解压和安装的工作,实现的代码很简单:
... ClassLoader scl = ClassLoader.getSystemClassLoader(); //读取要安装资源的配置信息。 String base = installConfig.getResourceBase(); ResourceCollection resources = InstallConfig.getInstance().getResources(); for ( int i=0;inew File(res.getDistPath()); File distFile = new File(distDir,res.getName()); InputStream srcFile = scl.getResourceAsStream(base+res.getName()); if ( !distFile.exists() && srcFile!=null ) { // 将文件释放庢指定位置, 详细代码看源程序 extractFile(srcFile, distFile); } } ...程序实现起来非常简单,关键是打包时,各个文件的位置,以下再来个例子说明一下:
[myProj] [src] install-config.xml [dist] [res] 在此目录结构是,myProj是我项目的主目录,src是本文源程序位置,install-config.xml也在其中。 dist是打包后的目录位置。 res是我们要进行自动解压安装的相关文件的位置,所有要安装的文件就在其中,我提供的build.xml可以自动将其打进包内。为配合此程序,我另外***了方便打包的ant编译脚本文件build.xml,在我文后提供的下载包有详细的用法说明。欢迎大家下载使用。
下载全部源文件
相关文章推荐
- 用设计模式开发通用数据库操作器
- 恍然大悟!!!!?????
- string interning
- String.Substring()使用注意
- 今天买了一只宝珠笔
- 几乎所有基于Java的web app都需要Model 2( part I)
- 几乎所有基于Java的web app都需要Model 2 (part II)
- “QQ尾巴病毒”核心技术的实现
- BouncyCastle JCE实践(五)
- access 如何解决组合框无法满足大量数据的选择问题?
- ASP自定义函数,仿VBA中域函数 DLookup
- JDBC2.0實現數據分頁
- Win32下Foxbase+数据库浏览程序的编写
- 用Excel编写小游戏
- 我就是程序,程序就是我吗?
- 查询区分大小写
- com之套间(Apartment)
- 全新的搜索功能
- Borland CTO Blake Stone & Chuck J gone to Microsoft
- [转帖]Why you can't catch some exceptions