如何在Eclipse RCP中使用第三方包(圖)

這兩天一直被在Eclipse插件項目中導入第三方包的問題所困擾啊,我在項目中使用了dom4j的第三方包,可是在插件運行是一直報“noClassDefFound”的錯誤,在網上找了些文檔解決的方式也不明瞭,這篇文章圖文並茂,適合我這個初學者,所以轉過來了。

 

另外,好像這種方法在往其他人的機器上發佈時還得從新配路徑(看到有人提出這個問題,自己還沒實驗:P)。還有人提出可以把導入的第三方包做成插件,直接在depends裏面添加插件引用即可。(這個方法我試了,但是有不少錯誤,還得在試試,也歡迎有成功者介紹經驗啊!)

 

 

我們拿一個簡單的示例來說明,這個示例使用的是eclipse rcp的template中最簡單的一個,也就是大家都見過的Hello,RCP。我用的eclipse版本是3.2M2。
  
  爲了便於說明,我自己寫了一個java文件然後打包成jar,再在rcp程序中調用它。這個程序是這樣的:
  
  Code:
  package demo;
  
  public class Hello {
  public static String sayHello()

 
  {
  return "hello,world";
  }
  }
  [Ctrl+A Select All]
  
  就這麼簡單,打包後做成一個hello.jar。具體過程略去不談。
  
  然後我們新建一個rcp application,具體過程也略去不談。這裏需要提醒大家的是rcp工程的名字最好用小寫英文,用大寫的話可能會出一些問題,至少在我用的這個版本是這樣。
  
  建好以後在下面新建一個lib目錄作爲存放第三方庫的目錄。再把前面做好的hello.jar拷貝過去。參見下圖。
我們拿一個簡單的示例來說明,這個示例使用的是eclipse rcp的template中最簡單的一個,也就是大家都見過的Hello,RCP。我用的eclipse版本是3.2M2。
  
  爲了便於說明,我自己寫了一個java文件然後打包成jar,再在rcp程序中調用它。這個程序是這樣的:
  
  Code:
  package demo;
  
  public class Hello {
  public static String sayHello()
  {
  return "hello,world";
  }
  }
  [Ctrl+A Select All]
  
  就這麼簡單,打包後做成一個hello.jar。具體過程略去不談。
  
  然後我們新建一個rcp application,具體過程也略去不談。這裏需要提醒大家的是rcp工程的名字最好用小寫英文,用大寫的話可能會出一些問題,至少在我用的這個版本是這樣。
  
  建好以後在下面新建一個lib目錄作爲存放第三方庫的目錄。再把前面做好的hello.jar拷貝過去。參見下圖。
我們拿一個簡單的示例來說明,這個示例使用的是eclipse rcp的template中最簡單的一個,也就是大家都見過的Hello,RCP。我用的eclipse版本是3.2M2。
  
  爲了便於說明,我自己寫了一個java文件然後打包成jar,再在rcp程序中調用它。這個程序是這樣的:
  
  Code:
  package demo;
  
  public class Hello {
  public static String sayHello()
  {
  return "hello,world";
  }
  }
  [Ctrl+A Select All]
  
  就這麼簡單,打包後做成一個hello.jar。具體過程略去不談。
  
  然後我們新建一個rcp application,具體過程也略去不談。這裏需要提醒大家的是rcp工程的名字最好用小寫英文,用大寫的話可能會出一些問題,至少在我用的這個版本是這樣。
  
  建好以後在下面新建一個lib目錄作爲存放第三方庫的目錄。再把前面做好的hello.jar拷貝過去。參見下圖。

 

 

圖一

 

在RCP工程中,你可以有兩種辦法把jar加入到class path中,你可以任選一種:
  
  1、和普通的工程一樣,加入到build path裏面,參見下面圖二。



 圖二

 

2、打開plugin的Build頁面,注意到最下面有個“Extra Classpath Entries”了麼?展開以後選Add Jars把需要
     的jar加進去,有同樣的效果,參見圖3

圖三

 

我在這裏說“任選一種”的意思是不要兩種辦法同時用,否則工程會報錯。

      在上面的工作都做完之後,仍然在plugin的Build頁面上,左邊的Binary Build下面把你程序的輸出目錄(我的工程裏面是bin)和你的jar所在的目錄(我的工程裏面是lib)打勾,這樣輸出時候會包含你編譯後的文件以及第三方庫。仍然參照第三張圖
  
  然後切換到plugin的Runtime頁面,在右下角的Classpath裏面把你程序的輸出目錄(我的程序裏面是bin)和你所有要包含的jar文件(我的程序裏面是lib/hello.jar)都加進去。參照圖4,這樣就基本上完成了。
 

圖四

 

之後所要做的事情就是修改程序了,我在這裏只是簡單地把程序的標題做了修改,找到ApplicationWorkbenchWindowAdvisor這個類,把preWindowOpen修改成下面這樣:
  
  Code:
  
  public void preWindowOpen() {
  IWorkbenchWindowConfigurer configurer = getWindowConfigurer();
  configurer.setInitialSize(new Point(400, 300));
  configurer.setShowCoolBar(false);
  configurer.setShowStatusLine(false);
  configurer.setTitle(Hello.sayHello());
  }
  [Ctrl+A Select All]
  
  這個示例就完成了,之後產生product文件後export出來就可以看到結果了。過程也略去不談。
  
  運行以後會發現標題欄從“Hello,RCP”變成了“hello,world”,參見第圖五。



 
 

圖五

 

RCP實踐之第三方JAR包 寫道
感謝大家對上一篇文章的拍磚,引起的反響不小,目的達到了~,希望可以繼續板兒磚橫飛!

     今天來說說第三方JAR包的引入。RCP開發(或者plugin開發)中最讓人頭疼就是第三方JAR包的引入了,很多初學的朋友常常頭疼,介紹的文章也不少了,如果搞不定,自己google一下就可以了。

    爲什麼第三方JAR包會引發如此衆多的問題,其實並不是Eclipse的錯,而是先入爲主的錯。如果你一開始就就接觸Eclipse開發,以後再做不同java開發,你就會覺得java的類加載機制是變態了~Eclipse的類加載機制是基於OGSI的實現,它完成了插件的獨立加載和獨立維護,正是因爲這種變態的類加載機制,纔有了我們頭大的第三方jar包的問題,也正是這種偉大的類加載機制,纔有了即插即用的思路的誕生。

     大多數簡單的RCP項目都是將所有的JAR包放入本地項目中,然後直接進引入項目路徑,就開始整了,對於小的應用,或者開發人員少的情況下,這樣是可行的,也是便捷的~但是RCP的目標是大型的企業級應用,一個系統由十幾個,幾十個插件組成,是很正常的。所以就要求我們將RCP中所有用到的第三方JAR包統一管理,統一維護,給開發人員少一些煩惱。

思路有兩種:

    1.將JAR文件plugin樣子包裝,及新建Plug-in from existing jar archives 項目,然後選擇JAR文件,再取消Unzip the jar archives into the project 選項,然後其它的插件依賴它就可以了。

     2.新建一個不同插件項目,然後把第三方JAR包放入這個項目,然後引入到此項目中,在plugin.xml的runtime配置頁的Exported Packages 選Add... 再選擇要發佈出去的包路徑,然後其他的插件依賴它就可以了。

     官方推薦的方式是第一種,個人認爲第一種確實很好,可以非常好而且方便的維護第三方JAR包。但是我還是選擇了第二種方式,理由是,配置文件讀取的問題。

    每一個插件文件都會維護一份屬於自己的配置文件,只有這樣才能做到自我獨立。但是這兩種方式都不能使其他插件項目的配置文件獨立維護,原因就是Eclipse那討厭又強大的類加載機制。

    使用第一種方式,配置文件必須放在你記載的進來的JAR包的裏面,這樣Eclipse類加載機纔會加載並處理,除非選擇了Unzip the jar archives into the project 選項,並把配置文件和一堆的class文件放在同一目錄下類加載機才能發現。我想這種方式誰都不會喜歡,要麼就是我們要創造自己的JAR包,要麼工作臺遍佈了各種各樣來自世界各地的class文件。

    使用第二種方式,是通過運行時將需要發佈出來供別人依賴的package發佈出來,而配置文件則需要放在此插件項目中。相對而言,這種比上一種有很大的好處,而且也不是那麼難維護。

    以上只是自己項目中的一些總結,關於第三方JAR包的問題,我查了很多資料,好像逃不過這三種方式(直接在項目中依賴算一種),不知道各位大俠還有沒有更好的辦法,即能處理好第三方JAR包,又能保持各個插件維護自己獨立的配置文件?

轉載自http://www.blogjava.net/leeguannan/archive/2007/06/20/125423.html

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章