我将 Felix 用作嵌入式应用程序,如 如何从代码中启动和使用 Apache Felix?. 我想要做的是通过 OSGi 从我的主机应用程序动态加载 jar 文件并调用实现类的方法。
所以我有以下三个maven项目
1)一个有接口的maven项目。并且导出了这个接口的包。---> 项目。
2) 一个实现项目 --> ProjB,另一个 maven 项目,它将 ProjA 作为 maven 依赖项导入并使用具体类在其上实现接口。同样在这个项目中,我为 ProjA 接口包做 OSGi 导入包。同样在这里,我通过激活器在 OSGI 上注册了我的实现。
3)然后是托管应用程序的ProjC。我在那里做的是,
HostActivator activator = new HostActivator();
List<Object> list = new LinkedList<Object>();
list.add(activator);
map.put(FelixConstants.SYSTEMBUNDLE_ACTIVATORS_PROP, list);
Felix f = new Felix(map);
f.start();
Bundle a = f.getBundleContext().installBundle("file:C:/ProjA.jar");
Bundle b = f.getBundleContext().installBundle("file:C:/ProjB.jar"); ); // dirty path ;)
b.start();
ServiceReference sr = activator.getContext().getAllServiceReferences(MyInterface.class.getName(), "(" + "osgi-device-name" + "=*)")[0];
MyInterface dictionary = (MyInterface) activator.getContext().getService(sr);
dictionary.doAction();
一切正常,直到演员。在那里我可以看到以下错误,
Exception in thread "main" java.lang.ClassCastException: projB.MyImplementation cannot be cast to projA.MyInterface
at MyHostApplication.MyMainClass.main(MyMainClass.java:70)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
任何人都可以帮我解决这个问题,对我来说,这似乎是 felix 上的一个错误。