eclipse插件类加载错误

时间:2013-03-13 12:49:45

标签: java eclipse-plugin osgi

在eclipse插件项目中,我有一个jar文件,我想从中加载类和调用方法。这些jar在manifest文件中的bundle classpath中添加。如何加载这些类运行时,如果我用urlclassloader尝试它我得到java.lang.NoClassDefFoundError但我确信类在那里。我读了eclipse osgi并使用自己的类加载器,可能因为这个我得到了这个错误。但为什么 ?有没有人对我的问题有一个很好的解释和实际解决方案? 谢谢。

2 个答案:

答案 0 :(得分:3)

这是由OSGi的不同类加载机制引起的问题。 首先,检查是否向清单添加了正确的import声明。 如果导入正确(并且具有正确的版本),则它们可能不可见,因为您使用的JAR未导出所需的类。 OSGi只能看到导出的类。 使用Eclipse,这意味着您使用Equinox作为OSGi实现,您可以使用Eclipse-Buddy-Classloading。 使用JAR创建一个新项目并导出所有内容。现在将其注册为主包的伙伴 - 主包现在可以看到提供包的每个类。

请记住,在OSGi中使用类加载器是“邪恶的”。无法通过完全限定的类名来识别类。

查看OSGi核心规范,了解有关OSGi类加载(osgi.org)和http://rajakannappan.blogspot.de/2010/03/eclipse-classloading-and-buddy-policy.html

的更多信息

答案 1 :(得分:0)

我遇到了类似的问题,这是我的解决方案。这可能有点晚了,但我希望它会帮助其他人解决同样的问题。

我注意到eclipse(osgi)的类加载器不会加载完整的jar。它只加载通过classloader.load(classname)直接加载的类。所以我只是用this question中的代码读取jar中包含的所有类名,并通过调用显式classloader.load(classname)遍历所有classNames。以下是我管理它的方式示例:

private void loadClasses(final File jar) {
    final URL url = new URL("jar", "", "file:" + jar.getAbsolutePath() + "!/");
    final List<String> classNames = getAllClassNames(jar); //Code from above link in this method
    final URLClassLoader classloader = new URLClassloader(url, this.getClass().getClassLoader());
    for (String className : classNames) {
        classLoader.load(className);
    }
}

如果要实例化一个类,可以使用

进行
final Class<?> clazz = classLoader.load(className);
final T type = (T)clazz.newInstance();

希望这有帮助。