0

我对 osgi 和 bndtools 相当陌生,并从 bndtools教程开始

本教程运行良好,然后我尝试使用我自己的测试项目来实现接口,在实现中,我试图使用org.simpleframework将 xml 文件反序列化为 java 类

我得到以下 classnotfound 异常。另外,我确实包含了包(有问题的类是其中的一部分)作为我正在运行的包中的私有包的一部分

java.lang.ClassNotFoundException:java.net.URLClassLoader$1.run(Unknown Source) at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) 的 packagename.classname。 net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at org. simpleframework.xml.strategy.Loader.load(Loader.java:50) at org.simpleframework.xml.strategy.TreeStrategy.readValue(TreeStrategy.java:163) at org.simpleframework.xml.strategy.TreeStrategy.read(TreeStrategy. java:102) 在 org.simpleframework.xml.core.Source.getOverride(Source.java:370) 在 org.simpleframework.xml.core.Factory.getConversion(Factory.java:207) 在 org.simpleframework.xml.core.ObjectFactory.getInstance(ObjectFactory.java:63) 在 org.simpleframework.xml.core.Composite 的 org.simpleframework.xml.core.Factory.getOverride(Factory.java:139) .read(Composite.java:141) 在 org.simpleframework.xml.core.Composite.readVariable(Composite.java:687) 在 org.simpleframework.xml.core.Composite.readInstance(Composite.java:635) 在 org. simpleframework.xml.core.Composite.readUnion(Composite.java:610) at org.simpleframework.xml.core.Composite.readElement(Composite.java:593) at org.simpleframework.xml.core.Composite.readElements(Composite. java:506) 在 org.simpleframework.xml.core.Composite.readSection(Composite.java:388) 在 org.simpleframework.xml.core.Composite.read(Composite.java:367) 在 org.simpleframework.xml.core .Composite.read(Composite.java:234) 在 org.simpleframework.xml.core.Composite.read(Composite.java:202) 在 org.simpleframework.xml.core.Composite.read(Composite.java:150) 在 org.simpleframework.xml.core.Traverser .read(Traverser.java:92) at org.simpleframework.xml.core.CompositeList.populate(CompositeList.java:175) at org.simpleframework.xml.core.CompositeList.read(CompositeList.java:148) at org. simpleframework.xml.core.Composite.readVariable(Composite.java:682) at org.simpleframework.xml.core.Composite.readInstance(Composite.java:635) at org.simpleframework.xml.core.Composite.readUnion(Composite. java:610) 在 org.simpleframework.xml.core.Composite.readElement(Composite.java:593) 在 org.simpleframework.xml.core.Composite.readElements(Composite.java:506) 在 org.simpleframework.xml.core .Composite.readSection(Composite.java:388)在 org.simpleframework.xml.core.Composite.readDefault(Composite.java:262) 在 org.simpleframework.xml.core.Composite .read(Composite.java:232) 在 org.simpleframework.xml.core.Composite.read(Composite.java:202) 在 org.simpleframework.xml.core.Composite.read(Composite.java:150) 在 org. simpleframework.xml.core.Composite.readVariable(Composite.java:687) at org.simpleframework.xml.core.Composite.readInstance(Composite.java:635) at org.simpleframework.xml.core.Composite.readUnion(Composite. java:610) 在 org.simpleframework.xml.core.Composite.readElement(Composite.java:593) 在 org.simpleframework.xml.core.Composite.readElements(Composite.java:506) 在 org.simpleframework.xml.core .Composite.readSection(Composite.java:388)在 org.simpleframework.xml.core.Composite.readDefault(Composite.java:262) 在 org.simpleframework.xml.core.Composite .read(Composite.java:232) 在 org.simpleframework.xml.core.Composite.read(Composite.java:202) 在 org.simpleframework.xml.core.Composite.read(Composite.java:150) 在 org. simpleframework.xml.core.Traverser.read(Traverser.java:92) at org.simpleframework.xml.core.CompositeList.populate(CompositeList.java:175) at org.simpleframework.xml.core.CompositeList.read(CompositeList. java:148) 在 org.simpleframework.xml.core.Composite.readVariable(Composite.java:682) 在 org.simpleframework.xml.core.Composite.readInstance(Composite.java:635) 在 org.simpleframework.xml.core .Composite.readUnion(Composite.java:610) 在 org。simpleframework.xml.core.Composite.readElement(Composite.java:593) at org.simpleframework.xml.core.Composite.readElements(Composite.java:506) at org.simpleframework.xml.core.Composite.readSection(Composite. java:388) 在 org.simpleframework.xml.core.Composite.read(Composite.java:367) 在 org.simpleframework.xml.core.Composite.readDefault(Composite.java:262) 在 org.simpleframework.xml.core .Composite.read(Composite.java:232) 在 org.simpleframework.xml.core.Composite.read(Composite.java:202) 在 org.simpleframework.xml.core.Composite.read(Composite.java:150) 在org.simpleframework.xml.core.Traverser.read(Traverser.java:92) 在 org.simpleframework.xml.core.Persister.read(Persister.java:632) 在 org.simpleframework.xml.core.Persister.read( Persister.java:613) 在 org.simpleframework.xml.core.Persister。在 org.simpleframework.xml.core.Persister.read(Persister.java:528) 在 org.simpleframework.read(Persister.java:550) 在 org.simpleframework.xml.core.Persister.read(Persister.java:550) 读取(Persister.java:591) .xml.core.Persister.read(Persister.java:433) 在 com.mlsm.implementation.MLSMImpl.parseMLSM(MLSMImpl.java:150) 在 com.mlsm.implementation.MLSMImpl.executeInternal(MLSMImpl.java:84) 在com.mlsm.implementation.MLSMImpl.parseAndExecute(MLSMImpl.java:182) 在 com.mlsm.implementation.MLSMImpl.start(MLSMImpl.java:65) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect。 NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.apache.felix.dependencymanager.ServiceImpl.invoke(ServiceImpl.java:484) 在 org.apache.felix.dependencymanager.ServiceImpl.access$000(ServiceImpl.java:44) 在 org.apache.felix 的 org.apache.felix.dependencymanager.ServiceImpl.activateService(ServiceImpl.java:441)。 dependencymanager.ServiceImpl$3.run(ServiceImpl.java:125) at org.apache.felix.dependencymanager.SerialExecutor$1.run(SerialExecutor.java:47) at org.apache.felix.dependencymanager.SerialExecutor.scheduleNext(SerialExecutor.java: 84) 在 org.apache.felix.dependencymanager.SerialExecutor.execute(SerialExecutor.java:68) 在 org.apache.felix.dependencymanager.ServiceImpl.calculateStateChanges(ServiceImpl.java:147) 在 org.apache.felix.dependencymanager.ServiceImpl .start(ServiceImpl.java:257) 在 org.apache.felix.dependencymanager.DependencyManager.add(DependencyManager.java:56) 在 com.mlsm.implementation。Activator.init(Activator.java:24) 在 org.apache.felix.dependencymanager.DependencyActivatorBase.start(DependencyActivatorBase.java:76) 在 org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:645)在 org.apache.felix.framework.Felix.activateBundle(Felix.java:2152) 在 org.apache.felix.framework.Felix.startBundle(Felix.java:2070) 在 org.apache.felix.framework.BundleImpl.start (BundleImpl.java:976) 在 aQute.launcher.Launcher.update(Launcher.java:422) 在 aQute.launcher.Launcher.activate(Launcher.java:346) 在 aQute.launcher.Launcher.run(Launcher.java: 235)在aQute.launcher.Launcher.main(Launcher.java:92)SecureAction.startActivator(SecureAction.java:645) at org.apache.felix.framework.Felix.activateBundle(Felix.java:2152) at org.apache.felix.framework.Felix.startBundle(Felix.java:2070) at org .apache.felix.framework.BundleImpl.start(BundleImpl.java:976) 在 aQute.launcher.Launcher.update(Launcher.java:422) 在 aQute.launcher.Launcher.activate(Launcher.java:346)。 launcher.Launcher.run(Launcher.java:235) 在 aQute.launcher.Launcher.main(Launcher.java:92)SecureAction.startActivator(SecureAction.java:645) at org.apache.felix.framework.Felix.activateBundle(Felix.java:2152) at org.apache.felix.framework.Felix.startBundle(Felix.java:2070) at org .apache.felix.framework.BundleImpl.start(BundleImpl.java:976) 在 aQute.launcher.Launcher.update(Launcher.java:422) 在 aQute.launcher.Launcher.activate(Launcher.java:346)。 launcher.Launcher.run(Launcher.java:235) 在 aQute.launcher.Launcher.main(Launcher.java:92)第346章)在aQute.launcher.Launcher.run(Launcher.java:235)第346章)在aQute.launcher.Launcher.run(Launcher.java:235)

这就是在 service start() 中所做的

public void start() {
      Serializer serializer = new Persister();
      File result = new File(filePath);
      serializer.read(<ClassToSerializeTo>.class, result);
}

还有一点需要注意的是,这段代码在 osgi 框架之外也能正常工作。让我知道更多信息是否有助于调试问题。

我也读了这篇文章,但仍然对手头的问题感到困惑。

编辑:所以我发现只有当 xml 有一个看起来像这样的元素时才会发生这种情况

   <TestElement class="PackageName.Classname">

有任何想法吗?

谢谢

4

2 回答 2

0

我刚刚下载了当前版本的 simple-xml.jar。Manifest 现在显示 OSGi 属性。所以我的猜测是这个库不是用 OSGi 编写的。所以它可能有类加载问题。你应该在他们的邮件列表上询问他们是否应该在 OSGi 上工作。

如果这是框架中的问题,那么开发人员可能会解决这个问题。也许您可以找到解决方法,但这可能并不容易。

于 2014-10-16T04:42:54.260 回答
0

我通过在反序列化代码参考之前添加这两行来修复它

类加载器 thisClassLoader = .getClassLoader(); Thread.currentThread().setContextClassLoader(thisClassLoader);

于 2014-10-16T06:27:01.230 回答