Jeffrey's Sky

          Go with wind
          隨筆 - 14, 文章 - 1, 評論 - 15, 引用 - 0
          數(shù)據(jù)加載中……

          Eclipse 插件開發(fā)中的 classnotfound 問題(轉(zhuǎn)載)

          目的Eclipse插件開發(fā)中,經(jīng)常要引用第三方包或者是引用其他插件中的類,由于插件開發(fā)環(huán)境引用類路徑的設(shè)置和運(yùn)行平臺引用類路徑的設(shè)置不同,經(jīng)常導(dǎo)致開發(fā)過程OK,一旦運(yùn)行則出現(xiàn)NoClassDefFoundError的問題。本文的目的是全面分析各種情況下類路徑的設(shè)置,以避免這個問題的出現(xiàn)。

           

          說明Jar包和類路徑實(shí)際上是一個概念,比如類com.bbebfe.Test.class打包為test.jar包,添加類引用就直接添加test.jar包。而如果是添加類文件路徑,則添加包目錄的上級目錄,比如lib/com/bbebfe/Test.class,則添加lib文件夾,而不是com文件夾。在此后的例子中都只說明Jar包的形式。

           

          分析Eclipse插件開發(fā)對于Jar包的引用主要有三種原因:

          1. 插件引用第三方包(普通的jar包或者類文件,不是插件)。

          a)        開發(fā)環(huán)境引用配置,在prject -> properties -> Java build path中設(shè)置。

          b)        運(yùn)行環(huán)境引用配置,在plugin manifest編輯器的Runtime選項(xiàng)卡下的classpath中添加tset.jar包的引用(在MANIFEST.MF中表現(xiàn)為Bundle-ClassPath: lib/test.jar, plugin.xml表現(xiàn)為<runtime>節(jié)下的引用

                                   i.  類文件在lib目錄下,如下的設(shè)置導(dǎo)出lib目錄下所有目錄:

          <runtime>

                      <library name="lib/">

                       <export name="*"/>

                      </library>

             </runtime>

                                 ii.  test.jarlib目錄下:

                  <runtime>

                      <library name="lib/test.jar">

                       <export name="*"/>

                      </library>

             </runtime>

                                iii.  實(shí)際上上面的設(shè)置可以簡化為:

          <runtime>

                      <library name="lib/"/>

             </runtime>

              或者

          <runtime>

                      <library name="lib/test.jar"/>

             </runtime>

                 默認(rèn)即導(dǎo)出lib目錄下的所有包和jar下的所有包

                 實(shí)際上,執(zhí)行b)項(xiàng)設(shè)置后,會自動執(zhí)行a)項(xiàng)設(shè)置,使開發(fā)環(huán)境和運(yùn)行環(huán)境同時有效。

          2. 插件B引用插件工程A(非Eclipse插件,而是自己另外一個插件項(xiàng)目中的類)

          a)        首先必須將A中的B需要的類暴露(export)出來

                                   i.              如果有MANIFEST.MF文件,則表現(xiàn)為plugin manifest編輯器中runtime節(jié)的exported packages,通過這里添加需要export的包。在manifest.mf文件中是Export-Package: com.bbebfe

                                 ii.              如果只有plugin.xml,則表現(xiàn)為plugin manifest編輯器中runtime節(jié)的library visibility。plugin.xml文件中表現(xiàn)為

          <runtime>

                 <library>

                        <export name=”com.bbebfe.*”/>

                 ...

          b)        B插件工程的plugin manifest編輯器中的dependencies選項(xiàng)卡中添加對A插件的引用(這要求運(yùn)行對話框中的plugins列表的workspace plugins中必須包含A插件)。

          c)         如果B工程是一個RCP工程,則必須在product編輯器的configuration選項(xiàng)卡中包含A插件工程。

          3. 插件B引用Eclipse插件A的類。

          a)        Eclipse插件中的類都是Exported,因此這步省略。

          b)        B插件工程的plugin manifest編輯器中的dependencies選項(xiàng)卡中添加對A插件的引用(這要求preferences -> plugin development -> target目標(biāo)平臺必須包含A插件,且運(yùn)行對話框的plugins列表中的target platform中必須選中A插件)。

           

          總結(jié):如果B插件引用的A也是一個插件,則A必須出現(xiàn)在B插件的plugin dependencies引用中,而不是其他地方,否則肯定會出現(xiàn)運(yùn)行時NoClassDefFoundError問題(因此必須在plugin manifest編輯器的dependencies選項(xiàng)卡下進(jìn)行設(shè)置)。而且只需要在這里設(shè)置的設(shè)置對開發(fā)環(huán)境和運(yùn)行環(huán)境同時有效)

           

          注意:還有一種情況就是開發(fā)環(huán)境沒有某個包或者插件,而只在運(yùn)行環(huán)境(target)中存在,此時就必須設(shè)置正確的target,然后按照正常程序添加插件引用,但此時已經(jīng)不能在plugin manifestdependencies選項(xiàng)卡中設(shè)置(因?yàn)樵陂_發(fā)環(huán)境找不到這個plugin),而必須在plugin.xmlMANIFEST.MF文件中手工設(shè)置。plugin只要target中存在該插件,則開發(fā)和運(yùn)行也不會有問題。

          posted on 2008-10-14 10:19 Jeffrey Feng 閱讀(1352) 評論(0)  編輯  收藏 所屬分類: 開源技術(shù)

          主站蜘蛛池模板: 内乡县| 扶风县| 遂川县| 雷山县| 营口市| 舞阳县| 清远市| 北海市| 刚察县| 合水县| 清镇市| 绩溪县| 四平市| 靖西县| 来凤县| 视频| 什邡市| 永和县| 阿克陶县| 长泰县| 二连浩特市| 乡城县| 喀什市| 怀柔区| 四平市| 开封县| 中牟县| 清新县| 威信县| 左贡县| 长白| 岚皋县| 旬邑县| 湘乡市| 浦北县| 唐河县| 高阳县| 渭源县| 安义县| 固阳县| 瓮安县|