这个工具利用 ANT 来制作在 Windows, MacOS X, Unix 平台上可执行的文件,比如 exe,zip,jar。ROXES ANT Tasks 基于 GPL 发布。
http://www.roxes.com/produkte/rat.html
企业开源参考架构
Java Web应用产品安装程序制作方案
目录:
一.背景
二.开源工具
三.环境准备
四.技术准备
4.1. Jsmooth
4.1.1. Jsmooth简介
4.1.2.工作原理
4.2. IzPack
4.2.1.IzPack简介
4.2.2.工作原理
五.方案实例
六.结束
一. 背景:
随着Java在应用产品开发中的广泛应用,基于Java的应用产品也就越来越多,那么如何为基于Java的应用产品制作安装程序的需求就产生了。以前人们一般都是使用InstallShield与InstallAnyWhere进行产品安装程序的制作,这是两个功能非常强大、易用的安装盘制作工具,尤其是InstallAnyWhere,它还支持Java应用产品安装制作,例如:大名鼎鼎的Jbuilder安装程序就是由它制作的。
本文并不准备对这些商业的安装制作工具进行讨论,本文将就如何利用开源的安装制作工具来进行Java Web应用产品程序制作进行一些探讨。
二. 开源工具:
目前用于支持Java应用安装程序制作的开源工具非常丰富,本人将要本人在研究过程中所遇到的罗列一二以供参考:
Packlet
Packlet是一个简单的Java安装制作工具。它将Java Application打包成一个可以发布的类似于zip或tgz的压缩文件中。这个压缩文件被简为packlet,它可以在安装有Java 2 Runtime Environment的操作系统上执行. 通过执行packlet将会给用户提供一个图形化的安装配置界面并解压应用。
Go To Packlet
IzPack
IzPack是一个用于Java平台的安装程序生成器。它用于产生一个轻量级、能运行于所有安装了JVM的任何的操作系统的安装程序。生成的安装程序可以通过双击或在Command Line通过java –jar install.jar命令进行启动,安装程序运行的方式具体将看操作系统的支持方式。IzPack的主要好处就是能够生成运行于任意操作系统的安装程序。
Go To IzPack
JSmooth
Jsmooth可以将Java可执行应用Wrapper成window可执行Exe程序。通过Jsmooth生成的Exe程序会自动按制作时定义的顺序寻找合适的JVM,如果能不查找到JVM,安装程序会提示用户并能根据定义好的URL启动Web Browser让用户下载JVM. 注意:Jsmooth并不是纯Java应用。
Go To JSmooth
VAInstall
VAInsall是一个用Java写的多平台安装程序工具。它是基于GNU GPL2.0许可。通过一个简单的配置文件,它允许安装程序打包工具由不同的目录下收集程序包,这与一般情况下安装程序制作工具只能由一个根目录开始相比更为灵活。由VAInstall生成的安装程序允许先择不同的安装模式(graphic,text或ansi)。
Go To VAInstall
Java Service Wrapper
用于将Java Application安装成为Window NT Service.同时与之附带的scripts能够很容易将Java Application安装成为UNIX的后台进程。
Go To Java Service Wrapper
Lift Off Java Installer
Lift Off Java Installer的最大特色就是:自解压class 文件,对目标系统要求低以及跨平台性。
Go To Lift Off Java Installer
Toolshed
一个小巧、简单、纯Java实现的安装程序制作工作。
Go To Toolshed
Launch4J
Lauch4J也是一个Java应用Window Exe封装工具。通过Lauch4J,可以提供splash screen, 图标,自动查询JRE或内置JRE等功能,同时还支持启动失败反馈以及命令行参数。
Go To Launch4J
AntInstaller
AntInstaller是一个安装程序框架,它利用一个简单的XML定义安装界面,并以Ant执行安装过程。基于AntInstaller的安装程序可以打包成自解压jar通过command line执行可Swing GUI来执行。
Go To AntInstaller
Antigen
Antigen----即Ant Installer Generator。它主要的目的就是根据Ant脚本创建图形化安装程序。
Go To Antigen
FreeInstaller
FreeInstaller是一个开源项目,完全用Java编写。它将应用程序打包成一个自解压的Java应用。通过FreeInstaller可以将Java或非Java的应用安装到UNIX,LINUX以及window NT系统中。
Go To FreeInstaller
Mini Installer
一个简单的Java安装程序制作工具。整个制作过程是通过脚本完成的,最终生成一个可以通过双击方式执行的jar文件。
Go To Mini Installer
通过对如上各产品的初步探索,本人最终选择了利用izpack + jsmooth作为Java Web应用产品的安装程序制作方案。选择这两种工具并不代表其它开源工具不好,只是本人自已结合自已项目的需求(本人负责公司一企业应用开发平台的研发工作)及本人的偏好作出的选择。
由于本人所在公司为商业公司,所以本文描述的方案并不是企业应用开发系统平台的实现模式,本文只是提供一个解决办法,关于如何与自已的框架或平台进行有效的整合,请读者自行考虑。
三. 环境准备:
你需要安装J2SDK1.4.1+版本;关于J2SDK请由Sun公司下载;
你需要安装Ant1.6.2版本,理论上其它版本也行,只是本人用的是1.6.2;
请下载并安装izpack;设定定装到IZPACK_HOME
请下载并安装jsmooth;设定安装到JSMOOTH_HOME
四. 技术准备:
为了便于理解,你需要对Java进行应用的开发有一定的基础,本例将以Web应用的安装程序制作为背景进行相关介绍,所以需要你对Web 应用开发以及其发布方式有一定的基础;另外,本方案将会以Ant作为应用build的工具,所以你需要有一定的Ant技术;对于如上相关知识本部分不准备介绍。下面本部分将主要对izpack及jsmooth进行简单的介绍。
4.1. jsmooth:
4.1.1 Jsmooth 简介:
Jsmooth,一个Java可执行应用封装器(Wrapper),即将Java可执行应用程序(即可执行jar)封装为Window可执行文件------exe文件的工具。
通过Jsmooth将可执行jar封装为Exe文件,使得用户执行Java应用就如同执行一般的Window应用程序一样,重用用户经验。
Jsmooth对jar进行封装时可以设定classpath,JVM参数,命令行参数,JVM版本及位置,这样用户在执行exe时不用关心JVM,Classpath等问题,这样就简化了Java应用执行。
4.1.2 工作原理:
通过Jsmooth生成的Window Exe文件通常定义为“Jsmooth Application”;
要想生成Jsmooth Application,我们需要一个JsmoothGen 项目文件-----.jsmooth文件,后面我们将其称为“.jsmooth文件”;.jsmooth文件实际上是一个xml文件,用于描述/定义Jsmooth Application的相关属性,例如:classpath, JVM,Java main方法类,以及其它与Java应用运行相关的各种设定等;通常你可以通过Jsmooth提供的JsmoothGen.exe--------Windows Project Editor来创建和编辑这个文件,这个Editor如下图所示:
(图-1)Widnow Project Editor
(图-2)Widnow Project Editor
(图-3)Widnow Project Editor
在.jsmooth文件生成之后,就可以通过如下方式生成目标Jsmooth Application,即Exe文件:
(1)。Window Project Editor:
你可以直接在如上图所示的编辑器通过工具条来生成:ProjectàCreate Exe。
(2)。Command Line:
你也可以进入。jsmooth文件所以目录,通过如下命令来生成目标Exe文件:
………> %jsmooth_home%"jsmoothcmd.exe yourproject.jsmooth
(3)。通过Ant任务调用生成目标Exe:
首先你需要在你的build文件中加入jsmooth Ant 任务定义:
<>
classname="net.charabia.jsmoothgen.ant.JSmoothGen"
classpath="${jsmooth_home}/lib/jsmoothgen-ant.jar"/>
然后,通过jsmoothgen任务来执行生成Exe的工作:
skeletonroot=”${jsmooth_home}/skeletons”/>
所以通过Jsmooth我们可以很容易将Java Application制作Windows Exe应用。
关于Jsmooth的详细介绍请参考http://jsmooth.sourceforge.net
4.2. izpack:
4.2.1. izpack简介:
izpack是基于Apache Software License 2.0许可的开源项目;
izpack是纯Java,对部分特性有针对不同平台版本的Library。例如:快捷键的创建。
izpack是一个用于解决安装程序制作的Builder工具;
通过izpack制作的安装程序可以运行于不同的操作系统,Windows, Linux, Unix等,只要安装了JDK1.4以及其后版本即可;
izpack优秀的模块化设计可以允许你定制安装程序外观、安装过程等;同时允许你通过其提供API调整izpack安装过程。
izpack的主要功能包括(但不限于):
· XML based installation files
· easy internationalization using XML files (10 translations are already available)
· Ant integration, command-line compiler
· easy customization with the panels and a rich API (even an XML parser is included !)
· powerful variable substitution system that you can use to customize scripts and more generally any text-based file
· different kinds of installers (standard, web-based, ...)
· launching of external executables during the installation process and Unix executable flag support (useful for the scripts for instance)
· layout of the installation files in packs (some can be optional)
· native code integration facilities
· jar files nesting support
· ... more things to discover and create !.
(图-4)IzPack制作的安装界面示例-选择安装的Pack.
4.2.2. 原理及过程
利用izpack制作安装程序的主要有两步:
第一步:创建并描述安装定义文件;
第二步:通过izpack提供CommandLine工具或Ant Task对安装定义文件进行编译,编译的结果即是生成一个可执行的jar文件,其中包括了整个安装过程的实现以及安装数据;
安装定义文件:
安装过程定义文件是一个XML文件,installation是根元素,表示定义的开始。定义主要由如下几部分组成:
1.….
用于定义安装程序的基本信息;
产品中文名称
产品版本号,例如:1.0-062312
公司网址
JDK版本号:1.4.2
2.……
用于定义安装程序界面信息,例如:
3.……..
定义变量或配置信息,变量在整个安装制作的过程中非常重要,变量两种用途:其一:作为配置用,例如可以通过按照一定的命名称规则为某个变量设定一个值,izpack在执行安装过程中将会读取某个变量的值来决定某个安装向导窗口是否可见等;例如:我们可以通过定义compareToVariable.、compareToOperator.与compareToValue.的组合决定第个用户自定义的向导窗口在安装时是否可见,这样就可以通过上个窗口用户选择来决定下个窗口是否可见;其二:作为替换变量用,通常安装过程中收集的信息存放在变量中,然后,在安装程序进行到最后,利用变量的值来替换安装目标文件中的内容。
4. ….
决定,安装程序界面所支持的语言。
5. ……..
用于为安装界面指定图片或图标
用于指定用户自定义安装向导窗口定义XML文件的位置
用于指定安装向导窗口中国际化资源XML文件的位置
等等,例如:
<resources>
<res src="langsel.jpg" id="installer.langsel.img" />
<res src="readme.html" id="HTMLInfoPanel.info" parse="yes" type="plain" encoding="GB2312" />
<res src="readme_chn.html" id="HTMLInfoPanel.info_chn" parse="yes" type="plain" encoding="GB2312" />
<res src="license.html" id="HTMLLicencePanel.licence" parse="yes" type="plain" encoding="GB2312" />
<res src="license_chn.html" id="HTMLLicencePanel.licence_chn" parse="yes" type="plain" encoding="GB2312" />
<res src="shortcutSpec.xml" id="shortcutSpec.xml" parse="yes" type="xml" encoding="GB2312" />
<res src="Unix_shortcutSpec.xml" id="Unix_shortcutSpec.xml" parse="yes" type="xml" encoding="GB2312" />
<res src="packsLang.xml" id="packsLang.xml" />
<res src="packsLang_chn.xml" id="packsLang.xml_chn" />
<res src="UserInputSpec.xml" id="userInputSpec.xml" />
<res src="UserInputLang.xml" id="userInputLang.xml" />
<res src="UserInputLang_chn.xml" id="userInputLang.xml_chn" />
resources>
6. …….
本部分用于定义整个安装过程,每个panel即是一个安装向导窗口,panel是按顺序由IzPack调用的。IzPack内置了很多的Panel,另外它还支持用户自定义的功能,主要是通过UserInputPanel来实现的,你可以通过在……中定义的ID为UserInputSpec.xml的资源(XML)中定义UserInputPanel窗口中用户录入项目及相关存放的变量。另外,Izpack支持条件用户自定义Panel,即ConditionalUserInputPanel,你可以在….中通过变量来控制这样的向导窗口的可见性。当安装过程执行到InstallPanel时IzPack开始解压安装包到硬盘中,所以,一般来说所有的配置信息(例如,安装目录,安装包的选择等)都应在InstallPanel之前完成。在InstallPanel之后可以通过ShortcutPanel来显示快捷方式创建窗口,另外还可以通过ProcessPanel来执行一些后续操作。
<panels>
<panel classname="HTMLLicencePanel" />
<panel classname="HTMLInfoPanel" />
<panel classname="TargetPanel" />
<panel classname="PacksPanel" />
<panel classname="UserInputPanel" />
<panel classname="SummaryPanel" />
<panel classname="InstallPanel" />
<panel classname="ShortcutPanel" />
<panel classname="SimpleFinishPanel" />
panels>
7. …….
本部分主要用于定义安装包,即将哪些文件进行打包,以及将来安装时如何进行安装。通过可以将应用程序文件分解成不同的安装包,可以指定哪些pack是必须安装的,哪些是可选的。
前边我们讲过,我们可以在中加入自定义向导窗口来允许用户指定一些配置,这些配置信息被存放到变量中,我们可以利用用户指定的值来替换应用程序中部分文件中的内容。那么在定义pack时,就可以指定哪些文件在安装时需要进行解析(parseable)。需要注意的,你需要指定需要解析的方式(xml, javaprop, plain,shell),如查将javaprop类型的文件解析类型设定为plain的话,可以就有问题,例如:如果变量的值为路径,那么在可能就会有问题。
另,对于每一个Pack在它安装(copy文件)之后,可以定义它执行一个程序,例如脚本程序。你可以利用这种功能来做一些工作,例如:你可执行脚本程序来导入数据库数据等。
下面是一个示例:
<packs>
<pack id="ToolKit" name="ToolKit" required="yes">
…………
pack>
<pack id="Core" name="Core" required="yes">
<description>在packsLang.xml和packsLang.xml_chn中描述了.description>
<fileset dir="app" targetdir="$INSTALL_PATH"app">
<include name="*" />
<include name="**" />
fileset>
<fileset dir="native" targetdir="$INSTALL_PATH"native">
<include name="*" />
<include name="**" />
fileset>
<file src="clear.db.splash.gif" targetdir="$INSTALL_PATH" />
<file src="init.db.splash.gif" targetdir="$INSTALL_PATH" />
<file src="installer.properties" targetdir="$INSTALL_PATH" />
<file src="installer.xml" targetdir="$INSTALL_PATH" />
<file src="installer.bat" targetdir="$INSTALL_PATH" />
<file src="uninstaller.bat" targetdir="$INSTALL_PATH" />
<parsable targetfile="$INSTALL_PATH/installer.properties"
type="javaprop" />