目錄:
隨著Java在應用產品開發中的廣泛應用,基于Java的應用產品也就越來越多,那么如何為基于Java的應用產品制作安裝程序的需求就產生了。以前人們一般都是使用InstallShield與InstallAnyWhere進行產品安裝程序的制作,這是兩個功能非常強大、易用的安裝盤制作工具,尤其是InstallAnyWhere,它還支持Java應用產品安裝制作,例如:大名鼎鼎的Jbuilder安裝程序就是由它制作的。
本文并不準備對這些商業的安裝制作工具進行討論,本文將就如何利用開源的安裝制作工具來進行Java Web應用產品程序制作進行一些探討。
目前用于支持Java應用安裝程序制作的開源工具非常豐富,本人將要本人在研究過程中所遇到的羅列一二以供參考:
Packlet
是一個簡單的
Java
安裝制作工具。它將
Java Application
打包成一個可以發布的類似于
zip
或
tgz
的壓縮文件中。這個壓縮文件被簡為
packlet
,它可以在安裝有
Java 2 Runtime Environment
的操作系統上執行
.
通過執行
packlet
將會給用戶提供一個圖形化的安裝配置界面并解壓應用。
|
IzPack
是一個用于
Java
平臺的安裝程序生成器。它用于產生一個輕量級、能運行于所有安裝了
JVM
的任何的操作系統的安裝程序。生成的安裝程序可以通過雙擊或在
Command Line
通過
java –jar install.jar
命令進行啟動,安裝程序運行的方式具體將看操作系統的支持方式。
IzPack
的主要好處就是能夠生成運行于任意操作系統的安裝程序。
|
Jsmooth
可以將
Java
可執行應用
Wrapper
成
window
可執行
Exe
程序。通過
Jsmooth
生成的
Exe
程序會自動按制作時定義的順序尋找合適的
JVM
,如果能不查找到
JVM
,安裝程序會提示用戶并能根據定義好的
URL
啟動
Web Browser
讓用戶下載
JVM.
注意:
Jsmooth
并不是純
Java
應用。
|
VAInsall
是一個用
Java
寫的多平臺安裝程序工具。它是基于
GNU GPL2.0
許可。通過一個簡單的配置文件,它允許安裝程序打包工具由不同的目錄下收集程序包,這與一般情況下安裝程序制作工具只能由一個根目錄開始相比更為靈活。由
VAInstall
生成的安裝程序允許先擇不同的安裝模式
(graphic,text
或
ansi)
。
|
用于將
Java Application
安裝成為
Window NT Service.
同時與之附帶的
scripts
能夠很容易將
Java Application
安裝成為
UNIX
的后臺進程。
|
Lift Off Java Installer
的最大特色就是:自解壓
class
文件,對目標系統要求低以及跨平臺性。
|
一個小巧、簡單、純
Java
實現的安裝程序制作工作。
|
Lauch4J
也是一個
Java
應用
Window Exe
封裝工具。通過
Lauch4J
,可以提供
splash screen,
圖標,自動查詢
JRE
或內置
JRE
等功能,同時還支持啟動失敗反饋以及命令行參數。
|
AntInstaller
是一個安裝程序框架,它利用一個簡單的
XML
定義安裝界面,并以
Ant
執行安裝過程。基于
AntInstaller
的安裝程序可以打包成自解壓
jar
通過
command line
執行可
Swing GUI
來執行。
|
Antigen----
即
Ant Installer Generator
。它主要的目的就是根據
Ant
腳本創建圖形化安裝程序。
|
FreeInstaller
是一個開源項目,完全用
Java
編寫。它將應用程序打包成一個自解壓的
Java
應用。通過
FreeInstaller
可以將
Java
或非
Java
的應用安裝到
UNIX,LINUX
以及
window NT
系統中。
|
一個簡單的
Java
安裝程序制作工具。整個制作過程是通過腳本完成的,最終生成一個可以通過雙擊方式執行的
jar
文件。
|
通過對如上各產品的初步探索,本人最終選擇了利用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進行簡單的介紹。
Jsmooth,一個Java可執行應用封裝器(Wrapper),即將Java可執行應用程序(即可執行jar)封裝為Window可執行文件------exe文件的工具。
通過Jsmooth將可執行jar封裝為Exe文件,使得用戶執行Java應用就如同執行一般的Window應用程序一樣,重用用戶經驗。
Jsmooth對jar進行封裝時可以設定classpath,JVM參數,命令行參數,JVM版本及位置,這樣用戶在執行exe時不用關心JVM,Classpath等問題,這樣就簡化了Java應用執行。
通過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應用。
-
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.
利用izpack制作安裝程序的主要有兩步:
第一步:創建并描述安裝定義文件;
第二步:通過izpack提供CommandLine工具或Ant Task對安裝定義文件進行編譯,編譯的結果即是生成一個可執行的jar文件,其中包括了整個安裝過程的實現以及安裝數據;
安裝過程定義文件是一個XML文件,installation是根元素,表示定義的開始。定義主要由如下幾部分組成:
1.…./STRONG>
用于定義安裝程序的基本信息;
產品版本號,例如:
1.0-062312/SPAN>
公司網址
/SPAN>
JDK
版本號:
1.4.2/SPAN>
/FONT>
|
2
.……/STRONG>
用于定義安裝程序界面信息,例如:
3.……../STRONG>
定義變量或配置信息,變量在整個安裝制作的過程中非常重要,變量兩種用途:其一:作為配置用,例如可以通過按照一定的命名稱規則為某個變量設定一個值,izpack在執行安裝過程中將會讀取某個變量的值來決定某個安裝向導窗口是否可見等;例如:我們可以通過定義compareToVariable.、compareToOperator.與compareToValue.的組合決定第個用戶自定義的向導窗口在安裝時是否可見,這樣就可以通過上個窗口用戶選擇來決定下個窗口是否可見;其二:作為替換變量用,通常安裝過程中收集的信息存放在變量中,然后,在安裝程序進行到最后,利用變量的值來替換安裝目標文件中的內容。
4. …./STRONG>
決定,安裝程序界面所支持的語言。
5. ……../STRONG>
用于為安裝界面指定圖片或圖標
用于指定用戶自定義安裝向導窗口定義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"
/>
SPAN style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: #3f7f7f">resources
>
|
本部分用于定義整個安裝過程,每個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"
/>
SPAN style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: #3f7f7f">panels
>
|
本部分主要用于定義安裝包,即將哪些文件進行打包,以及將來安裝時如何進行安裝。通過
可以將應用程序文件分解成不同的安裝包,可以指定哪些pack是必須安裝的,哪些是可選的。
前邊我們講過,我們可以在
中加入自定義向導窗口來允許用戶指定一些配置,這些配置信息被存放到變量中,我們可以利用用戶指定的值來替換應用程序中部分文件中的內容。那么在定義pack時,就可以指定哪些文件在安裝時需要進行解析(parseable)。需要注意的,你需要指定需要解析的方式(xml, javaprop, plain,shell),如查將javaprop類型的文件解析類型設定為plain的話,可以就有問題,例如:如果變量的值為路徑,那么在可能就會有問題。
另,對于每一個Pack在它安裝(copy文件)之后,可以定義它執行一個程序,例如腳本程序。你可以利用這種功能來做一些工作,例如:你可執行腳本程序來導入數據庫數據等。
下面是一個示例:
<
packs
>
<
pack
id
=
"ToolKit"
name
=
"ToolKit"
required
=
"yes"
>
…………
SPAN style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: #3f7f7f">pack
>
<
pack
id
=
"Core"
name
=
"Core"
required
=
"yes"
>
<
description
>
在
packsLang.xml
和
packsLang.xml_chn
中描述了
.
SPAN style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: #3f7f7f">description
>
<
fileset
dir
=
"app"
targetdir
=
"$INSTALL_PATH\app"
>
<
include
name
=
"*"
/>
<
include
name
=
"**"
/>
SPAN style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: #3f7f7f">fileset
>
<
fileset
dir
=
"native"
targetdir
=
"$INSTALL_PATH\native"
>
<
include
name
=
"*"
/>
<
include
name
=
"**"
/>
SPAN style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: #3f7f7f">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"
/>
&
|
我現在還在測試的方法是:把com(編譯產生的類文件目錄,是代碼中的包)、image(圖標目錄)和lib(第三方庫文件,比如jbuilder的jbcl.jar)壓縮成一個.jar文件,配合一個data(數據庫目錄,一個access文件),只要雙擊jar文件就可以運行。是不是還要一個jre安裝包?