最近、OSGi フレームワークを使い始めました。Java メイン アプリケーションから OSGi フレームワークを起動しようとしています。このチュートリアルに従って、OSGI コンテナーをプロジェクトに組み込みました。
以下は、OSGi コンテナーを起動するために使用している Java メイン アプリケーションです。以下のクラスでは、オブジェクトをBundleContext
使用することができ、これを使用して actual をインストールできます。framework
BundleContext
OSGi 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();
}
}
callMethodOfAnotherClass
OSGiBundleTest1 クラスから呼び出されます。framework
オブジェクトをOSGiBundleTest2クラスのコンストラクターまたはフレームワークオブジェクトを使用するメソッドに渡して、そこからBundleContextを取得することは考えていません...これを行う他の方法はありますか?
すべてのクラスが OSGI クラスローダーのみによってロードされるようにする方法はありますか?