Java eclipse插件类加载错误

Java eclipse插件类加载错误,java,eclipse-plugin,osgi,Java,Eclipse Plugin,Osgi,在eclipse插件项目中,我有一个jar文件,我想从中加载类并调用方法。这些JAR添加到清单文件的bundle类路径中。如何在运行时加载这些类,如果我尝试使用urlclassloader,我会得到java.lang.NoClassDefFoundError,但我确信类就在那里。我读到EclipseOSGi是基于它的,并使用它自己的类加载器,我可能因此而得到这个错误。但是为什么呢?有人对我的问题有很好的解释和实际的解决办法吗? 谢谢。这是由OSGi的不同类加载机制引起的问题。 首先,检查您是否向

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

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

请记住,在OSGi中使用类装入器是“邪恶的”。类不能再通过其完全限定类名进行标识


查看OSGi核心规范,了解有关OSGi类加载的更多信息(OSGi.org),我遇到了一个类似的问题,下面是我的解决方案。也许有点晚了,但我希望它能帮助其他有同样问题的人

我注意到eclipse的类加载器(osgi)没有加载完整的jar。它只加载通过
classloader.load(classname)
直接加载的类。因此,我只需读取jar中包含的所有类名以及来自的代码,并通过调用explicit
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);
    }
}
私有void加载类(最终文件jar){
最终URL=新URL(“jar”、“”和“文件:”+jar.getAbsolutePath()+“!/”;
final List classNames=getAllClassNames(jar);//此方法中来自上面链接的代码
final URLClassLoader classloader=新的URLClassLoader(url,this.getClass().getClassLoader());
for(字符串类名称:类名称){
load(className);
}
}
如果要实例化一个类,可以使用

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

希望这有帮助。

第一个实用的解决方案是停止使用URLClassLoader。为什么在那里?