我正在编写一个在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.jar,它只有一个Manifest.mf文件,可以让它准备好OSGI,但是根据OSGI框架类,不再有代码了。 我有另一个捆绑包只属于我当前的应用程序,它导入bundle1.jar并且唯一的目的是使用激活器在OSGI容器上注册MyService.class。
答案 0 :(得分:2)
为什么不将激活器类留在捆绑包中。在非OSGi环境中运行时,不会调用激活器类。在OSGi环境中运行时,它会。将OSGi依赖关系隔离到激活器是一个很好的策略。
答案 1 :(得分:1)
在大多数情况下,您可以在不使用Activator的情况下发布服务。请查看OSGI Comunity Wiki和Equinox example。
答案 2 :(得分:1)
另一种方法是使用蓝图。至少在简单的情况下,它允许根本不依赖于OSGi。对于真实世界的情况,您通常至少需要一些OSGi API,但在非OSGi情况下让它们处于非活动状态是没有问题的。
您可能还想尝试PojoSR。它允许在OSGi之外使用Activators和OSGi服务。我们开始在Apache Camel中使用它来测试OSGi代码。
答案 3 :(得分:1)
使用Spring-DM有助于删除对OSGi的代码依赖性。您的捆绑包不需要激活器,可以从spring-dm config xml导出服务。但是,这确实增加了更多的运行时依赖性,但是不需要编译依赖性。