昨天玩h2的時候想起來的, 這年頭把在線應(yīng)用報裝成桌面應(yīng)用是越來越流行了,幾年前做過類似的事情,簡單介紹一下。

1. 選擇一個嵌入的web 服務(wù)器和 數(shù)據(jù)庫。
web服務(wù)器我選擇的是jetty,雖然tomcat也有類似的嵌入版本,但是體積和性能都還是有點差距。 如果你的應(yīng)用使用了大量的ajax效果,建議選擇6的版本,對并發(fā)支持更好。
數(shù)據(jù)庫方面我原來用的是hsql,現(xiàn)在可以選擇h2. 兩者的sql 兼容性都比較好,擴展功能也比較強。如果原來的應(yīng)用在mysql上進行開發(fā),則基本不用做修改, h2現(xiàn)在有mysql兼容模式,如果原來應(yīng)用使用的是db2或者oracle,則你可能需要把一些函數(shù)和過程改用java實現(xiàn),h2提供了這方面的支持。 數(shù)據(jù)問題方面也不用擔(dān)心,h2目前比較成熟了,而且最大可以提供256g的文件支持。我做過一些測試,關(guān)機,死機,都還可以恢復(fù)的比較好。

h2的一個特性是支持只讀數(shù)據(jù)庫,所以你也可以選擇將數(shù)據(jù)庫備份成zip文件以后,以光盤的方式發(fā)布應(yīng)用,很適合做大量分發(fā)的演示光盤,比較酷吧。

jetty+h2的組合占用系統(tǒng)資源非常少,而且速度極快, 在我成功移植以后,我的一個同事吃驚的發(fā)現(xiàn)速度要比原來的online版本提高了很多。一般用戶幾乎感覺不到在線操作的那種停頓。

java6自帶的那個java數(shù)據(jù)庫就不要考慮了,速度慢,體積大,兼容問題多多。

2. 使用JDIC或者java6提供的一些native特性和桌面進行整合

主要使用諸如系統(tǒng)托盤來提供一些控制操作和輔助功能, 打開瀏覽器或者將瀏覽器嵌入到swing應(yīng)用等等。我的做法是將瀏覽器嵌入到swing應(yīng)用中,并做了一些小手腳,保證用戶不能使用瀏覽器直接訪問,這樣看起來更安全,更象桌面應(yīng)用。

java6在這些方面有比較好的支持,6以前的版本可以使用JDIC,反正都是一回事。 另外可以選擇jgoodie之類的擴展包,讓你的桌面看起來更騷包一些。

當(dāng)然,使用6的話啟動要快一些,特別是重復(fù)啟動的時候,java6還有的一個特性是splash的支持, 這樣在啟動的時候可以自然一些。

3.  對配置文件進行適當(dāng)精簡,使用混淆工具編譯關(guān)鍵包

發(fā)布到桌面以后就意味著受攻擊指數(shù)增加了,增加適當(dāng)?shù)姆婪兑彩潜匾模颂幦绻慌侣闊梢允褂胓cj來編譯。

4.  將執(zhí)行包編譯成exe文件, 使用安裝工具打包

把java啟動類編譯成可執(zhí)行文件的工具很多,我經(jīng)過比較,使用的是launch4j,主要是支持的特性多一些,對linux也提供支持。
然后再把jre和應(yīng)用整理規(guī)劃好目錄,使用安裝工具打包, 我選擇的是nsis, 也是免費的東西, nisi如果不想深入研究的話,建議找supertoy開發(fā)的一個腳本生成向?qū)Чぞ撸芎糜谩?br />
5. 其他

  * 需要考慮數(shù)據(jù)的備份和交換操作, 我一般使用dbunit來干這個事, 因為導(dǎo)出導(dǎo)入都可以是完整的xml文件,比較方便。
  * 如果要制作光盤版本,再配置一個auto run 就可以自動啟動了。
  * 要防止應(yīng)用多次啟動, 實現(xiàn)思路有2種,一個是使用一個端口來檢測, 另外一個就是使用文件鎖。 我使用的是后者,盜用了hsql的部分代碼。

基本思路很簡單,工作量也不大, 呵呵,反正當(dāng)初用戶是看不出來這是java 做得,還誤以為我們是用delphi之類重新開發(fā)的。