如何在插件開發中正確使用第三方jar包


如何在插件開發中正確使用第三方jar包

問題描述
  很多開發人員在eclipse插件開發中,經常會遇到第三方jar包無法訪問的問題,或者是明明在開發環境中一切正常,導出插件到了運行環境時卻出現"NoClassDefFoundError"異常等諸多問題。

  本文結合筆者插件開發遇到的問題,談談插件開發過程中應該如何正確配置第三方jar包。

解決過程
在一般插件項目中添加第三方jar包:
  1. 創建你的插件項目,並新建一個文件夾放置你需要的第三方jar包,如:<project>/lib。

  2. 從文件系統中導入或拷貝jar包至<project>/lib文件夾中,如:<project>/lib/activation.jar。

  3. 打開MANIFEST.MF文件,在插件編輯器的"Runtime"Tab頁中,把第三方jar包添加到"Classpath"面板中。

haha@sh 2011年04月21日 13:46
4. 如果該插件需要被其他插件依賴,則需要在插件編輯器的"Runtime"Tab頁中,在"Exported Packages"面板中添加所有允許訪問的包。


通過圖形界面編輯器配置后的MANIFEST.MF文件如下:

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Primeton Studio EosTest Core Plug-in
Bundle-SymbolicName: com.primeton.studio.eostest.core
Bundle-Version: 6.0.0
Bundle-Vendor: %Primeton
Bundle-Localization: plugin
Bundle-ClassPath: lib/activation.jar,
lib/jaxb-api.jar,
lib/jaxb-impl.jar,
lib/jsr173_1.0_api.jar
Export-Package: com.primeton.studio.eostest.core,
com.primeton.studio.eostest.core.model.cut,
...
javax.activation,
javax.xml.bind,
javax.xml.bind.annotation,
javax.xml.bind.annotation.adapters,
javax.xml.bind.attachment,
javax.xml.bind.helpers,
javax.xml.bind.util,
javax.xml.stream,
javax.xml.stream.events,
javax.xml.stream.util
Require-Bundle: com.primeton.studio.runtime,
org.eclipse.core.resources

 

haha@sh 2011年04月21日 13:47
構建插件項目:
  5. 打開build.properties文件,在插件編輯器的"Build"Tab頁的"Binary Build"面板中,選中需要構建的內容。



生成的build.properties文件如下:

output.. = bin/
bin.includes = META-INF/,\
               plugin.xml,\
               lib/jaxb-api.jar,\
               lib/jaxb-impl.jar,\
               lib/jsr173_1.0_api.jar,\
               lib/activation.jar,\
               plugin.properties,\
               plugin_zh_CN.properties
src.includes = META-INF/,\
               src/,\
               plugin.properties,\
               plugin.xml,\
               plugin_zh_CN.properties,\
               build.properties

 

haha@sh 2011年04月21日 13:48
在插件項目B中引用一個插件項目A的類:
  6. 首先,需要保證該類所在的包在插件A的MANIFEST.MF文件Export-Package:中,如上步驟4。

   7. 其次,打開插件項目B的MANIFEST.MF文件,在插件編輯器的"Dependencies"Tab頁中,把插件項目A添加到"Required Plug-ins"面板中。如果僅僅是在插件項目B的"Java Build Path"添加了插件項目A,則運行時肯定會出現運行時"NoClassDefFoundError"問題。

 

haha@sh 2011年04月21日 13:49
導出插件項目:
  8. 選中插件項目,在導出向導里選中"Deployable plug-ins and fragments"選項導出。

   
  9. 導出的插件分為三種形式,文件夾、zip包、jar包。導出的內容包括在上面插件項目構建步驟中,build.properties文件bin.includes中選中的內容。

   
  10. 其中jar包的形式需要在"Options"選項里選中"Package plug-ins as individual JAR archives"選項。

   

 

haha@sh 2011年04月21日 13:52
配置Feature項目:
   我們在做類似這樣的產品時,會創建一個feature項目用來描述所有的插件項目配置信息。如果我們將一個包含第三方類庫jar包的插件導出成一個 jar包的形式,運行產品時不會出現任何問題,可一旦需要在該產品上進行二次插件開發時,則會出現無法訪問插件jar包里的第三方jar包的問題。

  在dev.eclipse.org上也搜索到同樣的問題描述,估計是eclipse本身不支持訪問jar包內的jar文件造成的:

   "Adding lib/my.jar meant the plugin will always be a directory instead of a jar (eclipse doesn't load jars from withing jars). By default, my plugin itself shows up as the "." library, which isn't included in a directory plugin that includes other jars."

  因此需要將類似包含第三方jar包的插件 導出成文件夾的形式,具體步驟如下。打開feature.xml文件,在功能編輯器的"Plug-ins"Tab頁,選中想要配置的插件,並 在"Plug-in Details"面板中,選中"Unpack the plug-ins archive after the installation",這樣在插件安裝后會將插件解壓成文件夾形式。

   
  對於已經打成jar包的插件,也可以通過手動修改的方式實現。選中一個插件jar文件,解壓成同名文件夾,將類包壓縮成jar文件,如:swt.jar,並刪除原先的類包。

  修改META-INF下的MANIFEST.MF文件,如原先內容:

Bundle-ClassPath: lib/ktable_2.1.3.jar,
.
  則改成:

Bundle-ClassPath: lib/ktable_2.1.3.jar,
swt.jar
  即可。

將第三方jar包單獨包裝成一個插件項目:
  另外對於項目中使用到大量的第三方jar包時,可以采用eclipse官方推薦的方式,把第三方jar單獨包裝成一個插件項目。

  按Ctrl+N,在新建對話框里選擇"Plug-in from existing JAR archives",按下一步選擇你需要的jar文件。

   
  再下一步指定這個plugin的名稱,注意這一步里一般要把最下面的"Unzip the JAR archives into the project"選項清除,否則eclipse會把jar文件全部展開為.class文件樹,最后按Finish就可以了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM