我對osgi相當陌生,並且試圖一起獲得概念的功能性證明。felix上的OSGI classcast異常
設置是我的通用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上構建和執行。
感謝
尼科
獲得「A級不能轉換爲A類」是當多個類加載涉及一個經典的Java問題和OSGi有每捆一類加載器。 – SteveD 2010-04-28 14:15:36
bkail現貨。當我在類加載器跑了系統輸出我得到 [ 69.0 =類加載器對象服務 74.0 =類加載這個類 。 common-api在單獨的包中。這是否意味着我需要將它從我爲實現和測試包創建的jar中排除? – Nico 2010-04-29 12:44:12
謝謝。從一切和BAM中排除常見的api。奇蹟般有效 – Nico 2010-04-29 13:11:04