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