Eclipse plugin插件开发 NoClassDefFoundError

Eclipse plugin插件开发 NoClassDefFoundError

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/109561.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 粒子群算法matlab代码(注释很详细哦,图像也美美哒,任意维度)[通俗易懂]

    粒子群算法matlab代码(注释很详细哦,图像也美美哒,任意维度)[通俗易懂]整个程序分为5个脚本pso1_mian.m:主程序,在此脚本内设置参数。pso1_im.m:画出函数图像(仅1维和2维)pso1_in.m:初始化pso1_in2.m:迭代寻优并输出结果另外还有一个目标函数,单独为一个脚本。推荐的测试函数—>这里先上运行结果图下面是源码1.pso1_mian.m这里的目标函数用函数句柄的形式调用(第15行)%%粒子群算法%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%pso1_im

    2022年5月1日
  • javah -jni_java this用法

    javah -jni_java this用法目录一、native关键字二、javah命令一、native关键字native即JNI,JavaNativeInterface凡是一种语言,都希望是纯。比如解决某一个方案都喜欢就单单这个语言来写即可。Java平台有个用户和本地C代码进行互操作的API,称为JavaNativeInterface(Java本地接口)。二、javah命令1首先找到java文件目…

    2022年9月24日
  • 周星驰算巨星吗_国际巨星女明星

    周星驰算巨星吗_国际巨星女明星4月1日,国际著名的技术先锋人物、领先的反病毒厂商卡巴斯基实验室的创始人&CEO尤金•卡巴斯基与巨星成龙一起,在北京奥运会中的标志性建筑“鸟巢”,举办了“卡巴斯基诚献-‘龙的传人’成龙和他的朋友们2009北京大型演唱会”的媒体见面会。在现场,尤金•卡巴斯基与成龙共同宣布,“卡巴斯基诚献-龙的传人-成龙和他的朋友们北京演唱会”将在一个月之后,也就是五月黄金周在“鸟巢”盛大开唱。这是卡巴…

    2022年8月20日
  • docker pull image 打tag

    docker pull image 打tag

    2021年5月14日
  • jboss 配置文件_黑果小兵安装教程

    jboss 配置文件_黑果小兵安装教程一、Jboss下载:  1、点击 http://jbossas.jboss.org/downloads/找到合适的版本下载;  我这里是用的Jboss-as-7.1.1.Final版本,算是比较新的一个版本。    二、Jboss安装:  1、首先将下好的Jboss解压到自己想要存放的位置;  2、配置环境变量(非必要步骤),建议还是将环境变量配好,便于dos中命令操作;   …

    2022年9月27日
  • 7-16 三天打鱼两天晒网 (15分) 中国有句俗语叫“三天打鱼两天晒网”。假设某人从某天起,开始“三天打鱼两天晒网”,问这个人在以后的第N天中是“打鱼”还是“晒网”?「建议收藏」

    7-16 三天打鱼两天晒网 (15分) 中国有句俗语叫“三天打鱼两天晒网”。假设某人从某天起,开始“三天打鱼两天晒网”,问这个人在以后的第N天中是“打鱼”还是“晒网”?「建议收藏」7-16 三天打鱼两天晒网 (15分)中国有句俗语叫“三天打鱼两天晒网”。假设某人从某天起,开始“三天打鱼两天晒网”,问这个人在以后的第N天中是“打鱼”还是“晒网”?输入格式: 输入在一行中给出一个不超过1000的正整数N。输出格式: 在一行中输出此人在第N天中是“Fishing”(即“打鱼”)还是“Drying”(即“晒网”),并且输出“in day N”。 输入样例1: 103…

    2022年8月18日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号