首页 文章

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

提问于
浏览
8

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

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

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

1 回答

  • 8

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

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

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

相关问题