我对 osgi 还很陌生,正在尝试一起获得功能性的概念证明。
设置是我的通用 api 是在一个创造性地命名为 common-api.jar 的包中创建的,没有包激活器,但它导出了它的所有接口。对这种情况感兴趣的是 DatabaseService.java。
然后我有一个名为 systemx-database-service 的第二个捆绑包。这实现了数据库服务接口。这工作得很好,因为在实现包的激活器中我测试了与数据库的连接并选择了一些任意值。我还注册了我希望其他捆绑包可用的服务,如下所示:
context.registerService(DatabaseService.class.getName(), new SystemDatabaseServiceImpl(context), new Properties());
基本思想是,当您查找数据库服务的服务参考时,您将获得 SystemDatabaseService 实现。
当我进行检查服务时,输出如下:
-> inspect s c 69
System Database Service (69) provides services:
----------------------------------------------
objectClass = za.co.xxx.xxx.common.api.DatabaseService
service.id = 39
这会让我相信,如果我在测试包中这样做:
context.getService(context.getServiceReference(DatabaseService.class));
我应该取回 DatabaseService.class 的实例,但可惜没有这样的运气。它似乎无法找到该服务。坚持我这里我的故事变得陌生。
想着无处可去,但我写了这个怪物:
for (Bundle bundle : bundles) {
if (bundle.getSymbolicName().equals("za.co.xxx.xxx.database-service")) {
ServiceReference[] registeredServices = bundle.getRegisteredServices();
for (ServiceReference ref : registeredServices) {
DatabaseService service = (DatabaseService) context.getService(ref);
// use service here.
}
}
}
}
现在我实际上可以看到服务参考,但我收到了这个错误
java.lang.ClassCastException: za.co.xxx.xxx.database.service.impl.SystemDatabaseServiceImpl cannot be cast to za.co.xxx.xx.common.api.DatabaseService
这很疯狂,因为实现清楚地实现了接口!
任何帮助,将不胜感激。请记住,我对 osgi 的思维方式非常陌生,所以我的整个方法可能存在缺陷。
哦。如果有人想要清单,我可以发布它们。我正在使用 maven-bnd-plugin 在 felix 上构建和执行。
谢谢
尼科