首页 文章

构建一个应该在OSGI和非OSGI环境中工作的库的好方法是什么?

提问于
浏览
2

我正在编写一个在OSGI环境中运行的应用程序 . 现在我想提取一些代码并将其放在单独的bundle / jar文件中,以便在其他应用程序(OSGI或非OSGI)中重用它 .

我的目标是删除对OSGI环境类的任何依赖,因为它也应该在其他没有各种OSGI框架的jar(例如Equinox)的应用程序中运行 . 但与此同时,如果应用程序是OSGI应用程序,我想在OSGI环境中注册OSGI服务 .

我已经分离了代码,唯一剩下的OSGI依赖代码是目前我的Activator类,它将一些类注册为OSGI服务:

context.registerService(MyServiceInterface.class.getName(), new MyServiceImpl(), new Hashtable());

要删除依赖项,我想到以下内容:

  • 我从bundle1中删除了Activator和OSGI依赖项

  • 我创建了另一个bundle2,我移动了Activator

最后我有我的bundle1.jar,它只有一个Manifest.mf文件使它准备好OSGI,但是根据OSGI框架类,不再有代码了 . 我有另一个捆绑包只属于我当前的应用程序,它导入bundle1.jar并且唯一的目的是使用激活器在OSGI容器上注册MyService.class .

  • 这种方法是否正常或是否有其他最佳做法?

  • 是在OSGI环境中注册服务的良好实践还是主机应用程序应该负责的事情?

4 回答

  • 1

    为什么不将激活器类留在捆绑包中 . 在非OSGi环境中运行时,不会调用激活器类 . 在OSGi环境中运行时,它会 . 将OSGi依赖项与激活器隔离是一个很好的策略 .

  • 1

    在大多数情况下,您可以在不使用Activator的情况下发布服看看OSGI Comunity WikiEquinox example .

  • 2

    另一种方法是使用蓝图 . 至少在简单的情况下,它允许根本不依赖于OSGi . 对于真实世界的情况,您通常至少需要一些OSGi API,但在非OSGi情况下让它们处于非活动状态是没有问题的 .

    您可能还想尝试PojoSR . 它允许在OSGi之外使用Activators和OSGi服务 . 我们开始在Apache Camel中使用它来测试OSGi代码 .

  • 1

    使用Spring-DM有助于删除对OSGi的代码依赖性 . 您的捆绑包不需要激活器,可以从spring-dm config xml导出服务 . 但是,这确实会增加更多的运行时依赖性,但不需要编译依赖性 .

相关问题