OSGi Classloader没有找到一个类,也没有让我包含它

时间:2013-02-05 16:34:22

标签: java osgi classloader

我正在为第三方OSGi容器编写插件。该插件的代码如下所示:

  Resource r=factory.getInstance().getResource("test");
  String s=r.getList()[0];

它在第二行失败了,如下所示:

Caused by: java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.eclipse.equinox.internal.ds.model.ServiceComponent.activate(ServiceComponent.java:206)
        ... 34 more
Caused by: java.lang.NoClassDefFoundError: com/thirdparty/list
        at user1.SampleCode.main(SampleCode.java:20)
        ... 39 more
Caused by: java.lang.ClassNotFoundException: com.thirdparty.list
        at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:489)
        at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:405)
        at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:393)
        at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:105)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
        ... 42 more

然后,当我尝试将缺少的类包含到插件JAR中时,我得到了一个不同的错误:

Caused by: java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.eclipse.equinox.internal.ds.model.ServiceComponent.activate(ServiceComponent.java:206)
        ... 34 more
Caused by: java.lang.LinkageError: loader constraint violation: loader (instance of org/eclipse/osgi/internal/baseadaptor/DefaultClassLoader) previously initiated loading for a different type with name "com/thirdparty/list" 
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
        at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.defineClass(DefaultClassLoader.java:183)
        at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.defineClass(ClasspathManager.java:576)
        at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findClassImpl(ClasspathManager.java:546)
        at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClassImpl(ClasspathManager.java:477)
        at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass_LockClassLoader(ClasspathManager.java:465)
        at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass(ClasspathManager.java:445)
        at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.findLocalClass(DefaultClassLoader.java:211)
        at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:376)
        at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:452)
        at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:405)
        at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:393)
        at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:105)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
        at user1.SampleCode.main(SampleCode.java:20)
        ... 39 more

发生了什么事?似乎类加载器知道我需要的类,不会让我使用它,甚至不包括我自己的副本。

0 个答案:

没有答案