用jax-rs客户端解决osgi类加载问题

时间:2019-02-08 17:02:06

标签: java osgi

假设您有一个模块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的任何代码,因此该解决方案不适用于我。有人对我有其他提示吗,我该如何处理这些类加载问题?

1 个答案:

答案 0 :(得分:1)

创建具有满足捆绑A和B 的依赖关系的捆绑C

OSGi的模块化是一个优势,而不是劣势。如果应该共享一些第三方代码,最好将其放在自己的捆绑软件中。

现在,您只需要确保捆绑软件A和B的清单导入相同的内容即可。