最近很多人問我SWT Extension
項(xiàng)目上的那個不需要的JRE
的Example
是如何做出來的。我以前也會執(zhí)著于這個問題,畢竟如果不依賴于JRE
的話,就不需要為用戶準(zhǔn)備一個容量極大的安裝包,但是這種做法看似有利,實(shí)則有利有弊。
就我所知,目前把Java程序編譯成本機(jī)可執(zhí)行程序的方法有兩種,一種是GCJ,免費(fèi)的,一種是Excelsior JET,商業(yè)的。我已經(jīng)很久沒有碰過GCJ了,因?yàn)楫?dāng)初用起來實(shí)在是非常麻煩,現(xiàn)在的版本如何,我不太清楚。我自己使用的是Excelsior JET,版本為3.7。有一點(diǎn)要注意的的是,Excelsior JET的后續(xù)版本好像已經(jīng)不支持這個功能了,3.7是我所知的最后一個版本,能支持當(dāng)前所有的Win32平臺和早期的Linux(當(dāng)前比較流行的Ubuntu不支持,因?yàn)閮?nèi)核版本過高,不過企業(yè)版Redhat沒有問題)。不過我是很久以前從0day當(dāng)下來的,由于0day倉儲只保留一年,故現(xiàn)在已經(jīng)找不到了,我自己的機(jī)器上也沒有安裝包了(有一次大意之下,把整個Download目錄全給刪掉了,事后悔之晚矣)。
Excelsior JET無非就是用自己的Runtime來代替JRE,只是比JRE更加靈活,根據(jù)Java程序具體的依賴來生成對應(yīng)的Runtime。其實(shí)這個Runtime也挺大的,通常10M左右,不過比起JRE,那要小很多了。SWT Extension上的那個例子只有6M,是因?yàn)槲矣?/span>ASPack把所有的DLL文件全部壓縮過了,體積小了一半。
就我的感覺,Excelsior JET比GCJ更加靈活,也更好用,畢竟是商業(yè)版的東西,它的網(wǎng)站上曾經(jīng)有例子將Eclipse 3.0編譯成本機(jī)程序,不過我當(dāng)初照著例子試了一遍,沒有成功。Excelsior JET的編譯過程極為耗時,我上大學(xué)的時候,當(dāng)時機(jī)器只有128M內(nèi)存,編譯了一天JRE也沒有完成,后來找同學(xué)借了根256的內(nèi)存,這才得以完成。
把JAVA代碼編譯成本機(jī)程序的弊端也是有的,那意味著你將無法在線升級,GCJ也許可以,但是Excelsior JET是絕對不行的,這是因?yàn)樗詈笠徊揭獙λ?/span>DLL進(jìn)行鏈接,如果更換了DLL文件,它會檢測出來并報(bào)錯。
各位看官如果哪位有興趣,可以自行在網(wǎng)上查找Excelsior JET3.7或其他版本。由于安裝包我自己也沒有,故無法提供下載,見諒。