目的:Eclipse插件开发中,经常要引用第三方包或者是引用其他插件中的类,由于插件开发环境引用类路径的设置和运行平台引用类路径的设置不同,经常导致开发过程OK,一旦运行则出现NoClassDefFoundError的问题。本文的目的是全面分析各种情况下类路径的设置,以避免这个问题的出现。

 

说明Jar包和类路径实际上是一个概念,比如类com.bbebfe.Test.class打包为test.jar包,添加类引用就直接添加test.jar包。而如果是添加类文件路径,则添加包目录的上级目录,比如lib/com/bbebfe/Test.class,则添加lib文件夹,而不是com文件夹。在此后的例子中都只说明Jar包的形式。

分析:Eclipse插件开发对于Jar包的引用主要有三种原因:

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

a)        开发环境引用配置,在prject -> properties -> Java build path中设置。

b)        运行环境引用配置,在plugin manifest编辑器的Runtime选项卡下的classpath中添加tset.jar包的引用(在MANIFEST.MF中表现为Bundle-ClassPath: lib/test.jar, 在plugin.xml表现为<runtime>节下的引用

i.  类文件在lib目录下,如下的设置导出lib目录下所有目录:

<runtime>

<library name="lib/">

<export name="*"/>

</library>

</runtime>

ii.  test.jar在lib目录下:

<runtime>

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

<export name="*"/>

</library>

</runtime>

iii.  实际上上面的设置可以简化为:

<runtime>

<library name="lib/"/>

</runtime>

或者

<runtime>

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

</runtime>

默认即导出lib目录下的所有包和jar下的所有包

实际上,执行b)项设置后,会自动执行a)项设置,使开发环境和运行环境同时有效。

2. 插件B引用插件工程A(非Eclipse插件,而是自己另外一个插件项目中的类)

a)        首先必须将A中的B需要的类暴露(export)出来

i.              如果有MANIFEST.MF文件,则表现为plugin manifest编辑器中runtime节的exported packages,通过这里添加需要export的包。在manifest.mf文件中是Export-Package: com.bbebfe

ii.              如果只有plugin.xml,则表现为plugin manifest编辑器中runtime节的library visibility。在plugin.xml文件中表现为

<runtime>

<library>

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

...

b)        在B插件工程的plugin manifest编辑器中的dependencies选项卡中添加对A插件的引用(这要求运行对话框中的plugins列表的workspace plugins中必须包含A插件)。

c)         如果B工程是一个RCP工程,则必须在product编辑器的configuration选项卡中包含A插件工程。

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

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

b)        在B插件工程的plugin manifest编辑器中的dependencies选项卡中添加对A插件的引用(这要求preferences -> plugin development -> target目标平台必须包含A插件,且运行对话框的plugins列表中的target platform中必须选中A插件)。

总结:如果B插件引用的A也是一个插件,则A必须出现在B插件的plugin dependencies引用中,而不是其他地方,否则肯定会出现运行时NoClassDefFoundError问题(因此必须在plugin manifest编辑器的dependencies选项卡下进行设置)。而且只需要在这里设置的设置对开发环境和运行环境同时有效)

注意:还有一种情况就是开发环境没有某个包或者插件,而只在运行环境(target)中存在,此时就必须设置正确的target,然后按照正常程序添加插件引用,但此时已经不能在plugin manifest的dependencies选项卡中设置(因为在开发环境找不到这个plugin),而必须在plugin.xml或MANIFEST.MF文件中手工设置。plugin只要target中存在该插件,则开发和运行也不会有问题。

引用地址: http://blog.csdn.net/ruyanhai/article/details/2118868

最新文章

  1. 关于web页面性能测量指标与建议
  2. 百度Map与HT for Web结合的GIS网络拓扑应用
  3. 《C++primer》v5 第2章 变量和基本类型 读书笔记 习题答案
  4. HDU 5838 (状压DP+容斥)
  5. Appium客户端
  6. Dynamic CRM 2013学习笔记(四十四)CRM技术支持
  7. JavaScript学习记录总结(十)——几个重要的BOM对象
  8. mvvm 模式
  9. 360 chrome 国际版能够隐藏用户保存的密码
  10. 基于XMPP的即时通信系统的建立(二)— XMPP详解
  11. [转载]AOP面向方面编程
  12. 源码心德`Context`类
  13. 大型情感类电视连续剧--Android高德之旅(3)地图交互
  14. C++ 需要返回值的函数却没有返回值的情况 单例模式
  15. jquery validate 动态增加删除验证规则(转载)
  16. SaltStack 介绍和安装
  17. [转] 理解NLP中的卷积&amp;&amp;Pooling
  18. 20155219 2016-2017-2 《Java程序设计》第6周学习总结
  19. 解题:CTSC 2006 歌唱王国
  20. 提示&quot;Zend Optimizer not installed&quot;卸载安装也不行,什么原因如何解决?

热门文章

  1. printf(),类型修饰符
  2. 第一、初识C语言
  3. PHP入门二【PHP include 和 require的区别】
  4. nignx 负载均衡的几种算法介绍
  5. 移动端web开发基础概念
  6. Jekyll教程——精心收藏
  7. 数据格式json讲解
  8. NodeJS 初体验
  9. 新手如何查看API文档?
  10. git pull 然后 ahead of origin/master * commit 消失