0

最近、OSGi フレームワークを使い始めました。Java メイン アプリケーションから OSGi フレームワークを起動しようとしています。このチュートリアルに従って、OSGI コンテナーをプロジェクトに組み込みました。

以下は、OSGi コンテナーを起動するために使用している Java メイン アプリケーションです。以下のクラスでは、オブジェクトをBundleContext使用することができ、これを使用して actual をインストールできます。frameworkBundleContextOSGi bundles

public class OSGiBundleTest1 {

    public static Framework framework = null;

    public static void main(String[] args) throws BundleException {

        FrameworkFactory frameworkFactory = ServiceLoader.load(FrameworkFactory.class).iterator().next();
        Map<String, String> config = new HashMap<String, String>();

        framework = frameworkFactory.newFramework(config);
        framework.start();

        callMethod();
        callMethodOfAnotherClass();
    }

    private static void callMethodOfAnotherClass() {
        OSGiBundleTest2 ss = new OSGiBundleTest2();
        ss.someMethod();

    }

    private static void callMethod() throws BundleException {

        BundleContext context = framework.getBundleContext();

        System.out.println(context);
    }
}

これは、同じ Maven ベースのプロジェクトの 2 番目のクラスです。ここでも BundleContext を使用する必要があります。FrameworkUtil.getBundle(OSGiBundleTest2.class).getBundleContext()したがって、BundleContext を取得するために使用できると思いましたが、ここでは機能せず、そこで NPE を取得します。つまり、このクラスは OSGi クラスローダーによってロードされません。それでは、以下のクラスで BundleContext を使用する最良の方法は何ですか。

public class OSGiBundleTest2 {

public OSGiBundleTest2() {

}


public static void callMethodOfAnotherClass() {

    System.out.println(FrameworkUtil.getBundle(OSGiBundleTest2.class));

    BundleContext bundleContext = FrameworkUtil.getBundle(OSGiBundleTest2.class).getBundleContext();
}

}

callMethodOfAnotherClassOSGiBundleTest1 クラスから呼び出されます。frameworkオブジェクトをOSGiBundleTest2クラスのコンストラクターまたはフレームワークオブジェクトを使用するメソッドに渡して、そこからBundleContextを取得することは考えていません...これを行う他の方法はありますか?

すべてのクラスが OSGI クラスローダーのみによってロードされるようにする方法はありますか?

4

1 に答える 1