「How to start and use Apache Felix from code?」で説明されているように、私は Felix を組み込みアプリケーションとして使用していました 。. 私がやりたいことは、OSGi を介してホスト アプリケーションから jar ファイルを動的にロードし、実装クラスのメソッドを呼び出すことです。
だから私は次の3つのmavenプロジェクトを持っています
1) インターフェイスを持つ Maven プロジェクト。そして、このインターフェースのパッケージがエクスポートされます。---> プロジェクト .
2) 実装プロジェクト --> ProjB、ProjA を Maven 依存関係としてインポートし、具体的なクラスを使用してそれにインターフェイスを実装する別の 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)
誰かがこれについて私を助けてくれますか?私にとって、これはフェリックスのバグのようです。