搞了兩天,終于找到解決辦法了。原來 Eclipse 插件項目引入外面的jar包不能用 build path---->add external jars的方法。
先說明兩個概念:類加載器,OSGI
類加載器(class loader),顧名思義就是JVM用于加載類的一個工具。當然,它本身也是一個java類,見java.lang.ClassLoader。它維護内部的類名空間,互相關系(域),并為它們隔絕外部侵害。
OSGI,Open Service Gateway Initiative,則是一個開放的架構,主要特性包括熱插拔,bundle獨立等。現版本的eclipse就是基于這個架構實作的,而eclipse實作OSGI主要途徑,就是通過為每個bundle配置設定一個獨立的classloader,然後使用MANIFEST.MF檔案的配置,來維護這些bundle之間的關系。
比如一行代碼:
Platform.getBundle(BUNDLE_ID)
這就是獲得BUNDLE_ID的classloader的途徑,通過它來調用bundle(插件)裡面的類的方式和反射調用的方式一緻。
正題:
如何在一個插件裡引用jar包?有一些新學eclipse插件開發的朋友,往往會把需要用到的jar包添加到項目的運作環境裡面,這種做法雖然在eclipse編輯器編輯的時候不會出現問題,但一旦運作程式,就難免出現無法初始化類,或者找不到類的情況。
這就是因為,各bundle間的classloader是獨立的,在項目運作時添加的jar包,并沒有加載到本bundle的classloader中來,當然就會出現這種錯誤了。
兩種方案解決這個問題(本文使用的是eclipse 3.7):
1、如果一個jar包的使用範圍僅在本插件内部,那麼可以在MANIFEST.MF中選擇runtime簽頁,找到classpath區域,如圖:

點選“Add”按鈕,彈出如下對話框:
在這裡選擇你要添加的jar包即可。
注意!add向導裡顯示的檔案、檔案夾隻有本插件下的内容,是以,你需要建立一個“lib”檔案夾,把需要的jar放置在其下(檔案夾命名為lib是約定俗成的做法,如非必要,勿标新立異)。
2、如果一個jar包需要被多個插件引用,方案1就顯得麻煩了。可以采用jar包插件化的方法來實作公用的jar引用。
快捷鍵ctrl+N建立新"others",選擇
接下來按提示操作即可,這樣就生成了一個jar包插件。在你需要的位置依賴它即可。
-------------------------
3、雖然隻列了兩點,但其實還是有方式三的。即是結合上兩點,首先在classpath中引用jar包,然後在export package中開放這些jar包。然後在需要的插件裡依賴前插件,即可。這樣配置相對靈活一點。
<a href="http://www.cnblogs.com/wangjiyuan/p/jar.html">http://www.cnblogs.com/wangjiyuan/p/jar.html</a>