不同的osgi捆绑包具有相同接口的实现 - 在哪里放置那个界面?

Kim*_*ble 8 osgi

我目前正在测试一个新应用程序的osgi(Spring DM).应用程序需要能够侦听文件系统事件.今天我用一个简单的基于时间的轮询器解决了这个问题,但是当Java 7发布时,我可能想用基于NIO2的实现替换它.

到目前为止,我正在查看三个捆绑包,两个用于文件服务实现,另一个用于使用其中一个服务的业务逻辑.这两个实现应该实现相同的接口,所以我的问题是,在哪里放置该接口?将接口放在包含实现的包中会导致服务依赖于其中一个使用者.

什么是最好的,最像osgi的方式来构建它?到目前为止,我最好的办法是创建一个新的"api"包,定义实现的通用接口.

Ahe*_*Ahe 9

Separete api-bundle可能是最好的选择.它允许您稍后替换bundle实现.此外,使用单独的api-bundle,您可以热替换当前的捆绑包,而不需要消费者重新启动.

类(和接口)由其名称和类加载器识别.因此,如果将服务接口放在与实现相同的捆绑包中,则会失去热替换正在运行的捆绑包的能力.即使接口具有相同的名称,并且在每种意义上它都是相同的,新部署的bundle具有不同的类加载器=> consumer将新部署的bundle接口视为新类,并且不再满足其依赖性.

有关服务兼容性和版本的更多信息(请参阅注释):http://wiki.osgi.org/wiki/Service_Compatibility

  • 此外,您应该使用捆绑版本.这样,您甚至可以拥有相同API包的不同版本,甚至可以在一个框架中部署相同的服务. (3认同)