1. 程式人生 > >處理SWT bit版本與JDK bit版本的對應

處理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包如果經常換來換去的,也是可能出問題的。暫時沒找到更好的方法,先結合這兩種方法,用一段時間看看。記錄於此,以後找到更適用的解決方法再做修改。