Eclipse RCP:ClassNotFoundException或如何让其他bundle加载我的类

时间:2009-03-26 10:49:52

标签: reflection eclipse-plugin eclipse-rcp

详细信息:我正在尝试使用Jalapeno框架将我的RCP应用程序与Cache'数据库连接。建立连接后,我试图从表中获取所有数据,就像在Jalapeno手册中一样:

if (objManager==null) return;
DBClass cortege = null;
try {
Iterator terms = objManager.openByQuery(DBClass.class, null, null);
System.out.println("terms ok");
while (terms.hasNext()){
    System.out.println("has next");
    cortege = (DBClass)terms.next();
}

此代码编译,运行和调整异常

java.lang.RuntimeException: myPluginId.views.DBClass
at com.intersys.objects.POJOIterator.next(POJOIterator.java:75)
   ...skip...
   Caused by: java.lang.ClassNotFoundException: myPlugin.views.DBClass
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at org.eclipse.core.runtime.internal.adaptor.ContextFinder.loadClass(ContextFinder.java:129)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClassInternal(Unknown Source)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Unknown Source)
    at com.jalapeno.runtime.ObjectCopierToPojo.detach(ObjectCopierToPojo.java:76)
    at com.jalapeno.runtime.ObjectCopierToPojo.findPojo(ObjectCopierToPojo.java:472)
    at com.intersys.classes.CacheRootObject.detach(CacheRootObject.java:255)
    at com.intersys.classes.Persistent.detach(Persistent.java:567)
    at com.intersys.objects.POJOIterator.next(POJOIterator.java:59)

at terms.next();

我根本无法得到它...类DBClass的实例刚刚创建,但是类无法加载。 然后我试着将这段代码放在简单的java应用程序(不是eclipse rcp)中,一切顺利。所以我认为一些Eclipse部分阻塞类加载。

我也试过在调用terms.next();

之前加载类
Bundle b = Platform.getBundle("myPluginId");
try {
b.loadClass("DBClass");
} catch (ClassNotFoundException e) {
System.out.println("no class");
e.printStackTrace();
}

......并得到同样的错误。无法加载类。 那么,这是一个众所周知的问题吗?有解决方案吗?

更新

经过一些研究更新问题:

如何让Jalapeno插件从我的插件中加载类?

2 个答案:

答案 0 :(得分:3)

您可能想尝试好友类加载。有关Eclipse类加载的更多信息,Alex Blewitt编写了Eclipse here中类加载系统的精彩概述。它已有几年历史了,但在大多数情况下仍然具有相关性。

伙伴类加载的主旨是:

  • 一个插件声明它需要帮助加载类。它通过声明其“伙伴插件”

  • 来实现这一点
  • buddy插件声明其好友政策

  • 当常规加载机制失败时,Eclipse会尝试使用您指定的伙伴类加载策略。

所以在你的情况下,试着把:

Eclipse-BuddyPolicy: registered

在您的Jalapeno插件的manifest.mf文件

并提出:

Eclipse-RegisterBuddy: id.of.jalepeno.plugin

在插件的manifest.mf中

答案 1 :(得分:0)

我不确定,但也许你必须导出这些类所在的包。

在MANIFEST“运行时”中选择并添加所有包