Eclipse的每一个plugin都有属于自己的类加载器,这是OSGI架构的基础,每一个plugin项目都是一个bundle,独立运行在各自的运行环境里面,这就造成了开发时和运行时的不同。

Eclipse插件开发,切记不要随便引入别的plugin工程到自己的classPath中,正确的做法应该是引用插件依赖。下面就分几种情况来讲一下这个Eclipse插件项目运行时报错:NoClassDefFoundError。

首先引用http://www.blogjava.net/Jeffery001/archive/2008/10/14/234166.html所说的三种情况,最后我谈下我出现的第四种情况,就是前三种解决办法都不生效的时候,看下第4种。

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

ok 下面我说下第四种情况,这个比较特殊,目前百度上也没有搜到类似的解决办法,我是自己瞎试出来的。

4.我按照上述三种办法进行尝试解决的时候,出现一个问题,首先我的Eclipse插件项目没有MANIFEST.MF文件,而且plugin.xml中已经将所有的包暴漏出来了,但是Eclipse插件运行时候还是报错了,找不到类,那么我就开始思考是不是Eclipse插件运行时环境有缓存没有清掉,我重新clean了一次工程,rebuild了一下class文件,但是依然报错,我就开始翻阅Eclipse运行时的文件夹,一般在:F:\wfmSourceWorkSpa\tools_v3_ch\.metadata\.plugins\org.eclipse.pde.core\你的插件项目名 下,我在org.eclipse.osgi找到了一个文件,叫xxx.mf,我打开瞅了一眼,果然没错,我的包少暴漏了一个,于是我干掉了org.eclipse.osgi和org.eclipse.update这2个文件夹,然后重新debug我的工程,代码顺利过去。

落雨

2015年2月2日15:37:05

QQ 394263788

http://ae6623.cn

Eclipse plugin插件开发 NoClassDefFoundError的更多相关文章

  1. 快速掌握Eclipse Plugin / RCP开发思想

    本文转载:https://my.oschina.net/drjones/blog/280337 引言 本文不是快速入门的文章,只面向有一定基础的开发人员,至少看这篇文章之前你应该了解什么是Eclips ...

  2. Hadoop 1.1.2 eclipse plugin 编译 win7 集成

    Windows平台上使用ANT编译Hadoop Eclipse Plugin 一.准备工作:   1.安装JDK 下载页面:http://www.oracle.com/technetwork/java ...

  3. Peer Code Reviews Made Easy with Eclipse Plug-In

    欢迎关注我的社交账号: 博客园地址: http://www.cnblogs.com/jiangxinnju/p/4781259.html GitHub地址: https://github.com/ji ...

  4. GWT(Google Web Tookit) Eclipse Plugin的zip下载地址(同时提供GWT Designer下载地址)

    按照Eclipse Help->Install new software->....(这里是官方安装文档:http://code.google.com/intl/zh-CN/eclipse ...

  5. Installing the Eclipse Plugin

    Installing the Eclipse Plugin Android offers a custom plugin for the Eclipse IDE, called Android Dev ...

  6. Eclipse Plugin Dev Materials

    以下资料是本人在开发Eclipse 插件时候收集的一些比较有用的资料Link,和大家分享下. 比较权威的资料: Helpful Eclipse Plugin Websites: Eclipse Art ...

  7. Eclipse plugin web site 发布和版本更新

    Eclipse plugin web site 发布和版本更新 在eclipse插件开发过程中免不了要发布1.0, 1.1, 1.2…….等等,随着版本的递增,假如每次都发布一个插件zip包,那使用者 ...

  8. eclipse plugin 导出插件包

    当我们的插件在完成一个阶段性开发的时候,我们要发布一个1.0的版本.这个时候会碰到一个问题.如何把我们的插件打成包?有多种途径,下面具体讨论一下. 首先从插件完成到被他人(或者我们自己)使用有两个步骤 ...

  9. How to setup Eclipse with WinAVR and the Eclipse plugin AVR-eclipse

    源:How to setup Eclipse with WinAVR and the Eclipse plugin AVR-eclipse Arduino development with Eclip ...

随机推荐

  1. 20150511---Timer计时器(备忘)

    private void timer1_Tick(object sender, EventArgs e) { TimeSpan ts = , , ); string str = ts.Hours + ...

  2. 20150225--ASP.NET基础(2)

    一.引用外部样式表或JS,在<head>-</head>标签之间添加: <link href="yangshi.css" type="tex ...

  3. BeanFactory容器的设计原理

    XmlBeanFactory设计的类继承关系 1.BeanFactory接口提供了使用IoC容器的规范.在这个基础上,Spring还提供了符合这个IoC容器接口的一系列容器的实现供开发人员使用. 2. ...

  4. HTML 5中的文件处理之FileAPI(转载)

    原文地址:http://developer.51cto.com/art/201202/319435.htm 在众多HTML5规范中,有一部分规范是跟文件处理有关的,在早期的浏览器技术中,处理小量字符串 ...

  5. Fedora 19 vim c语言开发环境

    1. Fedora 19 居然没有自带 gcc 和 g++: sudo yum -y install gcc gcc-c++ 2. 安装 vim 和 cvim 插件: sudo yum -y vim ...

  6. Tables for condition techniques

    T682i  -- Access sequence and the tables   T685  -- Condition types and Access sequences   T683s  -- ...

  7. SQL联合查询中的关键语法(转)

    联合查询效率较高.以下例子来说明联合查询的好处 t1表结构(用户名,密码)    userid int         username   varchar(20)     password      ...

  8. jQuery对input中radio的一些操作

    通过jQuery获取页面中的所有radio对象,遍历页面中的radio,取消选中的标签,因为使用到jQuery时间,因此引用到了网上公共的js,这只是本人的一些总结,大神勿喷. <html> ...

  9. 【Qt】Qt之进程间通信(共享内存)【转】

    简述 上一节中,我们分享下如何利用Windows消息机制来进行不同进程间的通信.但是有很多局限性,比如:不能跨平台,而且必须两个进程同时存在才可以,要么进程A发了消息谁接收呢? 下面我们来分享另外一种 ...

  10. 为什么24位位图(真彩色)的biSizeImage不等于(biWidth*biBitCount+31)/32*4*biHeight?

    规定的,规定BMP文件的像素数据是按行存储的,而且每行的字节数必须为4的倍数,如果实际的像素数据不是4的倍数咋办?这就需要字节对齐,对齐是在一行的末尾添0以补足一行的字节数为4的倍数, ( biWid ...