假设您有一个模块A,它提供了模块B使用的静态方法。该方法使用jax-rs客户端从Web服务检索信息。该信息以字符串形式返回。模块B已经是osgi捆绑包。现在,模块A也需要转换为osgi捆绑包,但不允许更改其任何代码。因此,您只能将所需的元数据添加到清单文件中。我做到了,并将所有依赖项(包括jax-rs客户端)嵌入到一个jar文件中。现在,如果模块B调用模块A的静态方法,我将得到一个ClassNotFoundException
,因为模块B的类加载器用于查找jax-rs客户端。我进行了一些调试,如果我在模块A中执行行Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader())
,则一切正常,因为现在使用了模块A的类加载器,并且在该模块的类路径上找到了客户端。由于我无法更改模块A的任何代码,因此该解决方案不适用于我。有人对我有其他提示吗,我该如何处理这些类加载问题?
答案 0 :(得分:1)
创建具有满足捆绑A和B 的依赖关系的捆绑C 。
OSGi的模块化是一个优势,而不是劣势。如果应该共享一些第三方代码,最好将其放在自己的捆绑软件中。
现在,您只需要确保捆绑软件A和B的清单导入相同的内容即可。