Eclipse插件类加载错误



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

这是OSGi不同的类加载机制造成的问题。首先,检查您是否向清单中添加了正确的导入声明。如果导入正确(并且具有正确的版本),则它们可能不可见,因为您正在使用的JAR没有导出所需的类。OSGi只能看到导出的类。使用Eclipse,这意味着您正在使用Equinox作为OSGi实现,您可能会使用Eclipse- buddy - classloading。用JAR创建一个新项目并导出所有内容。现在将它注册为主bundle的好友——主bundle现在可以看到提供它的bundle的每个类了。

请记住在OSGi中使用类加载器是"邪恶的"。类不能再通过它们的完全限定类名来标识。

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

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

我注意到来自eclipse (osgi)的类加载器没有加载完整的jar。它只加载通过classloader.load(classname)直接加载的类。所以我只是从这个问题的代码中读取jar中包含的所有类名,并通过调用显式classloader.load(classname)来迭代所有类名。下面是我处理它的一个例子:

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();

相关内容

最新更新