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

时间: 2024-11-08 20:09:30

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

基于Java的Eclipse plug-in: 语言文字解码必备

需求背景 :TVT 测试中语言文字解码 在 TVT(Translation Verification Testing 翻译验证)测 试时,我们需要不断地将翻译成各种语言的 PII(Programmed Integrated Information 程序集成信息)文件 更新到我们的资源文件中,用于我们测试.对于资源文件的管理,我们大部分时候都会用到 RTC.但就 RTC 本身,或者说 eclipse 平台本身并不提供一种途径显示这些翻译后的文字本来的样子(就是以本国文字的形 式来显示),大量的信息

cordova plugin 插件开发

问题描述 cordova plugin 插件开发 我写了一个cordova 项目 现在如何把它封装成插件,刚接触我cordova

安装scala eclipse plugin导致pom.xml editor打开失败

一 问题描述     在本机搭建了基于Scala的Eclipse Plugin+scala2.10.3的开发环境, 但打开maven项目pom.xml文件时,却报空指针异常, pom editor打开失败.     查找了网上的一些资料,发现这是scala-ide-play2的一个BUG导致的.     可以参考如下信息:     scala-ide-play2 Version 0.4.0.v-2_10-201308021043-8c62ead breaks Maven POM Editor #

基于Java的Eclipse plugin开发概述

但 RTC 本身,或者说 eclipse 平台本身并没有一种很方便的途径让我们清楚地辨别出这些资源文件中的内容,而大量的信息只能以 Unicode 方式显示:例如:\u7675.因此我们急需一个工具或插件(eclipse plugin)自动地进行解码,来解决我的问题.这样我们所看到的将不再是让人费解的 Unicode,而是解码后的文字显示.(在刚才的例子中,会显示为"癵").总之,这个工具无论是对于http://www.aliyun.com/zixun/aggregation/7155

eclipse plugin

MyEclipse  For J2EE development. Note: I primarily use it as a JSP, Javascript, CSS, TLD, DTD editor XMLBuddy For XML file editing. Jalopy (commercial, latest stable version: 1.2) RegEx Tester Install it if you're planning on using Regular expression

Eclipse RCP插件开发中引用打包在插件目录下的图片资源

利用Eclipse插件技术开发的RCP,如果你使用相对主目录/绝对路径的方式来 访问图片等文件资源,在Eclipse环境下运行是没有问题的,但是在你导成插件 plugins时,它们全部导成了一个jar文件,这时原来可以正确运行的代码就会出 问题. 解决这个问题很简单,用Eclipse提供的 org.eclipse.ui.plugin.AbstractUIPlugin类的imageDescriptorFromPlugin方 法,示例代码如下: String imagePath = "icons/l

由使用Aptana studio eclipse plugin联想到的

     喜欢eclipse的朋友,可能多半都会装一些导航插件吧,比方说easyExplorer.在装了Aptana插件后,我卸掉了原先的EE,准备使用它自带的Explore Files,发现控制台打印出如下语句: cmd /C start explorer /select,/e, "D:\deimos\biz\common\src\java.test\com\deimos\result\DefaultResultReaderTest.java"        由此,联想到做windo

Eclipse Plug-in Hello world

这一篇就简单说下一个hello world插件工程创建过程. 1.创建一个Plug-in Project     2.填写project name     3.第二个确认框勾上,然后直接下一步     4.选择Hello,World的模版,直接finish     5.选中创建好的工程,右键如下操作     6.在新打开的Eclipse我们会发现多了个菜单栏和工具栏按钮   7.点击图标,会弹出下面窗口     这就是一个简单helloworld工程,可以看下模版生成的代码. 转载:http:/

hadoop 1.1.2 eclipse plugin 编译

环境  代码如下 复制代码 [andy@s41 ~]$ echo $JAVA_HOME /usr/java/jdk1.6.0_45 [andy@s41 ~]$ uname -a Linux s41 2.6.32-358.el6.x86_64 #1 SMP Fri Feb 22 00:31:26 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux [andy@s41 ~]$ cat /etc/redhat-release CentOS release 6.4 (Fina