我目前正在测试一个新应用程序的osgi(Spring DM)。应用程序需要能够侦听文件系统事件。今天我用一个简单的基于时间的轮询器解决了这个问题,但是当Java 7发布时,我可能想用基于NIO2的实现替换它。
到目前为止,我正在查看三个捆绑包,两个用于文件服务实现,另一个用于使用其中一个服务的业务逻辑。这两个实现应该实现相同的接口,所以我的问题是,在哪里放置该接口?将接口放在包含实现的包中会导致服务依赖于其中一个使用者。
构建这个的最好和最类似osgi的方法是什么?到目前为止,我最好的办法是创建一个新的“api”包,定义实现的通用接口。
答案 0 :(得分:8)
Separete api-bundle可能是最好的选择。它允许您稍后替换bundle实现。此外,使用单独的api-bundle,您可以热替换当前的捆绑包,而不需要消费者重新启动。
类(和接口)由其名称和类加载器识别。因此,如果将服务接口放在与实现相同的捆绑包中,则会失去热替换正在运行的捆绑包的能力。即使接口具有相同的名称,并且在每种意义上它都是相同的,新部署的bundle具有不同的类加载器=>使用者将新部署的bundle接口视为新类,并且不再满足其依赖关系。
有关服务兼容性和版本的更多信息(请参阅注释):http://wiki.osgi.org/wiki/Service_Compatibility