0

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

  资源 r=factory.getInstance().getResource("test");
  字符串 s=r.getList()[0];

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

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

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

引起:java.lang.reflect.InvocationTargetException
        在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        在 java.lang.reflect.Method.invoke(Method.java:597)
        在 org.eclipse.equinox.internal.ds.model.ServiceComponent.activate(ServiceComponent.java:206)
        ... 34 更多
原因:java.lang.LinkageError:加载程序约束违规:加载程序(org/eclipse/osgi/internal/baseadaptor/DefaultClassLoader 的实例)先前为名为“com/thirdparty/list”的不同类型启动加载
        在 java.lang.ClassLoader.defineClass1(本机方法)
        在 java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
        在 java.lang.ClassLoader.defineClass(ClassLoader.java:615)
        在 org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.defineClass(DefaultClassLoader.java:183)
        在 org.eclipse.osgi.baseadaptor.loader.ClasspathManager.defineClass(ClasspathManager.java:576)
        在 org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findClassImpl(ClasspathManager.java:546)
        在 org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClassImpl(ClasspathManager.java:477)
        在 org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass_LockClassLoader(ClasspathManager.java:465)
        在 org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass(ClasspathManager.java:445)
        在 org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.findLocalClass(DefaultClassLoader.java:211)
        在 org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:376)
        在 org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:452)
        在 org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:405)
        在 org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:393)
        在 org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:105)
        在 java.lang.ClassLoader.loadClass(ClassLoader.java:247)
        在 user1.SampleCode.main(SampleCode.java:20)
        ... 39 更多

到底是怎么回事?似乎类加载器知道我需要的类,并且不会让我使用它,甚至不会包含我自己的副本。

4

0 回答 0