1

「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)

誰かがこれについて私を助けてくれますか?私にとって、これはフェリックスのバグのようです。

4

2 に答える 2