目的: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中存在该插件,则开发和运行也不会有问题。

转载于:https://www.cnblogs.com/okuc/archive/2009/04/27/4149346.html

Eclipse插件开发中对于外部Jar包和类文件引用的处理(彻底解决插件开发中的NoClassDefFoundError问题)...相关推荐

  1. ADT17中引入外部JAR包时出现ClassNotFoundException

    在ADT17之前,如果要在Android项目中引入外部JAR包,只需在项目属性的Java Build Path中选择Add External JARs,然后选择相应JAR包即可.但是,在升级到ADT1 ...

  2. Eclipse中导入外部jar包——添加lib

    1.    首先在项目下创建一个文件夹,保存我们的jar包. 在项目名上右击,依次点击[New]-->[Floder],打开新建文件夹窗口 2.    输入文件夹名称[lib],点击[ok].我 ...

  3. Eclipse中导入外部jar包

    先在项目下创建一个文件夹,保存jar包. 右键项目,点击[New]->[Floder],打开新建文件夹窗口 输入文件夹名称[lib],点击[ok].我们通常在lib文件夹中存放从外部引入的jar ...

  4. Java程序中使用Spire Jar包报java.lang.NoSuchMethodError类型错误的解决方法

    Jar包功能概述 使用Spire系列的Jar包可以操作Word.Excel.PPT.PDF.Barcode等格式的文件,分别对应使用的jar包是Spire.Doc for Java.Spire.XLS ...

  5. Eclipse下导入外部jar包的3种方式

    转载自  Eclipse下导入外部jar包的3种方式   我们在用Eclipse开发程序的时候,经常要用到第三方jar包.引入jar包不是一个小问题,由于jar包位置不清楚,而浪费时间.下面配图说明3 ...

  6. android jar 加入图片,Android动态加载外部jar包及jar包中图片等资源文件

    Android动态加载外部jar包及jar包中图片等资源文件 Android应用程序由Java开发,因此Java中许多实用的特性,在Android中也有体现.动态加载Class,也就是外部jar包,在 ...

  7. Eclipse中要导出jar包中引用了第三方jar包怎么办

    Eclipse中要导出jar包中引用了第三方jar包怎么办 (2009-07-20 15:28:44) 转载▼ 标签: it 分类: Eclipse     今天做个小的java程序,想要先将其导出成 ...

  8. eclipse手动pom本地包_(转)如何在maven的pom.xml中添加本地jar包

    1 maven本地仓库认识 maven本地仓库中的jar目录一般分为三层:图中的1 2 3分别如下所示: 1 groupId 2 artifactId 3 version 4 jar包的依赖 如果要将 ...

  9. dos下编译运行java工程,并解决外部jar包依赖

    首先介绍一下我在eclipse中能够运行的工程目录结构: 接下来删除掉.settings  bin .classpath  .project这些目录和文件(避免干扰) 在src目录中有三个包 com. ...

最新文章

  1. 机器学习笔记:高斯过程
  2. python global将结果存储起来给另外一个文件对象使用
  3. React Native微信支付开发爬坑之旅
  4. mysql 禁用查询缓存 query cache
  5. Ubuntu 下解压缩命令全览
  6. DTNSim.java注释摘要(学习性质,有错漏的可能,红色为不明确部分)
  7. [Linux] Linux命令之pstree - 以树状图显示进程间的关系
  8. MyBatis学习总结[5]-动态 SQL
  9. 模拟美萍加密狗--Rockey2虚拟狗(一)
  10. Box2DSharp使用手册#1
  11. app 播放服务器文件,配置apple-app-site-association文件并在服务器上传
  12. uni-app cli创建项目打包并配置多环境读取配置文件信息
  13. 沃丰科技:AI赋能泛CRM,为新企服扬风鼓帆
  14. Dp-状态压缩:玉米田
  15. 【LeetCode】词典中最长的单词(附集合操作、lamda用法)
  16. 开根号的笔算算法图解_一个数的开根号怎么计算
  17. 脑裂的产生与解决方案
  18. 使用Vue3学习Vue的基础知识
  19. OpenGL绘制球体模拟自由落体运动(基于Qt)
  20. html地球转动效果,使用纯 CSS3 动画实现地球转动

热门文章

  1. php高德地图计算距离接口,路径长度-距离/面积计算-示例中心-JS API 示例 | 高德地图API...
  2. leetcode那些算法都用在了哪里
  3. #define c# 报错_#define 预处理指令(C++,C#,VB.NET)
  4. Docker容器虚拟化技术---Docker安装和操作1
  5. 互联网公司面试必备综合篇
  6. linux设置服务开机启动
  7. 携程Apollo分布式配置中心搭建指南
  8. springboot整合netty
  9. 内核代码架构图 :systemtap函数选择点
  10. zipimport — Import modules from Zip archives¶