我正在为第三方 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 更多
到底是怎么回事?似乎类加载器知道我需要的类,并且不会让我使用它,甚至不会包含我自己的副本。