如何在没有启动框架的其他类中获取BundleContext?

时间:2013-08-22 20:51:55

标签: java osgi apache-felix osgi-bundle

我最近开始使用OSGi框架。我正在尝试从Java主应用程序启动OSGi框架。我按照这个tutorial将OSGI容器嵌入到我的项目中。

下面是我用来启动OSGi容器的Java主应用程序。在下面的课程中,我可以使用BundleContext对象获取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项目中的第二堂课。我也需要在这里使用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();
}

}

将从OSGiBundleTest1类调用

callMethodOfAnotherClass。我不是想将framework对象传递给OSGiBundleTest2类的构造函数或者使用框架对象的某种方法,然后从那里获取BundleContext ......还有其他方法可以做这件事吗?

是否有任何方法可以确保所有类仅由OSGI类加载器加载?

1 个答案:

答案 0 :(得分:1)

确保类被OSGi类加载器加载的方法是将它们放在bundle中并实际使用OSGi来加载它们。