我正在开发和应用一系列将在 Karaf 上运行的 OSGI 包。 Bundles 具有相当多的互操作性,既公开大量服务,又相互使用服务。
但是,我非常希望能够与 bundle 一起构建应用程序的 WAR 文件。有一些客户端根本不允许在其服务器上使用 OSGI 容器。
所以我的问题是,将 OSGI 服务逻辑与应用程序逻辑分离的最佳方法是什么?激活器没有问题,因为它们只是在 WAR 部署中未使用,但我有很多从捆绑上下文中检索服务的调用,例如 bundleContext.getServiceReference(stuffISortOfNeed.class)
分散在我的代码中。 BundleContext 当前是激活器设置的静态对象。
这在对 OSGI 一无所知的 WAR 容器中是行不通的。
是否可以以某种方式将 BundleContext 和 getServiceReference 调用隐藏在实际应用程序之外?我最好喜欢一种类似注入(inject)的方法,在这种方法中,我可以使用 @Annotations 定义我的服务,并为 OSGI 和 PlainOldJava 定义和注入(inject)器。
最佳答案
要真正拥有 POJO,您可以使用 Blueprint XML 来注册您的 Web 应用程序包 (WAB)。 一个很好的例子可以在pax web project中找到。 .
通过在注释上使用 XML,您只有一个额外的资源文件,如果您将 bundle 组装为 war 文件中的库,则可以忽略该资源文件,而不会额外依赖于特定注释。
关于dependency-injection - 我如何构建既可以作为 OSGI bundle 又可以作为 WAR 运行的应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29914255/