處理SWT bit版本與JDK bit版本的對應
bit版本(bit version),是從國外一個論壇的帖子抄過來的,我原本也不清楚該怎樣命名它,覺得bit version挺合適的,就這樣使用起來了。
SWT bit version有32-bit和64-bit兩種,同樣,jdk也有32-bit和64-bit兩種。經過多次測試,發現32-bit SWT只能安裝在32-bit JDK 上,而64-bit SWT也只能安裝在 64-bit JDK上,兩都不能交叉使用,即32-bit SWT 不能在 64-bit JDK 上使用, 64-bit SWT 不能在 32-bit JDK 上使用,這兩種情況都會報類似"版本不相容“的錯誤。我們的產品用到SWT,而客戶環境的JDK可能會是32-bit或64-bit的,一般情況下,可以做個劃分,比如產品也對應地分出兩個版本,版本32-bit就只能安裝在32-bit的JDK上,版本64-bit就只能安裝在64-bit的JDK上,但這樣不好,如果客戶裝了32-bit的之後發現不行,再重新安裝64-bit的,換成是我,也會不爽的,所以要解決這個問題,讓產品能夠根據客戶選擇的JDK bit version來選用對應的SWT包。
研究了一下InatallAnywhere,發現可以對它做擴充套件。在這裡,我寫了一個擴充套件,在產品安裝完之後,執行一個Action,檢查客戶所選擇的JDK的bit version,再繫結對應bit version的SWT包。這種方法測試一段時間,發現可行性還挺好的,但之後又發現,如果客戶不選擇JDK,產品會到system32(此時是windows platform)時讀取java.exe,這時,會導致該Action判斷失誤,所以這種方法不能完全解決問題。
接著考慮了一段時間,想出了一個不算太好的方法來做個“容錯”處理。在產品安裝完後的lib包有swt32.jar和swt64.jar兩個包,預設使用的是swt32.jar,在產品啟動的時候,new display時,用try-catch處理一下,如果有異常,則客戶的JDK可能是64bit,這時就切換到swt64.jar,重新new display,繼續執行其它操作,參考程式碼如下所示:
public static void main(String args[]) { Launcher jcl = null; try{ Display d = new Display(); Shell s = new Shell(d, SWT.SHELL_TRIM); jcl = new Launcher(s, d); }catch(Error e){ //出現問題了,進行容錯處理 //預設是32 bit version String now = "E:\\product\\jar\\swt32.jar"; String swt64 = "e:\\swt64.jar"; //這時用swt64.jar替換swt32.jar doCopy(swt64, now); //重新啟動程式 Display d = new Display(); Shell s = new Shell(d, SWT.SHELL_TRIM); jcl = new Launcher(s, d); }
這種方法算是對前面Action的一個補充,在jar包切換的時候,只存在於產品首次啟動,之後就不會再做判斷或jar包切換了,當然,也會存在一些不好的地方,比如,swt包如果經常換來換去的,也是可能出問題的。暫時沒找到更好的方法,先結合這兩種方法,用一段時間看看。記錄於此,以後找到更適用的解決方法再做修改。