Как получить BundleContext в других классах, которые не запускают фреймворк?

Недавно я начал использовать OSGi framework. Я пытаюсь запустить инфраструктуру OSGi из основного приложения Java. Я следовал этому руководству, чтобы встроить контейнер OSGI в свой проект.

Ниже приведено основное приложение Java, которое я использую для запуска контейнера OSGi. В приведенном ниже классе я могу получить 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();
}

}

callMethodOfAnotherClass будет вызываться из класса OSGiBundleTest1. Я не думаю о том, чтобы передать объект framework конструктору класса OSGiBundleTest2 или какому-либо методу для использования объекта фреймворка, а затем получить оттуда BundleContext... Есть ли другой способ сделать это?

Есть ли способ убедиться, что все классы загружаются только загрузчиком классов OSGI?


person arsenal    schedule 22.08.2013    source источник
comment
Любой способ убедиться, что все классы загружаются только загрузчиком классов OSGI Ммм, да, поместите их в пакеты OSGi. Извините, а разве это не очевидно??   -  person Neil Bartlett    schedule 23.08.2013
comment
TechGeeky, пожалуйста, прочитайте «OSGi в действии» или следуйте некоторым из многочисленных руководств в Интернете. Я не думаю, что Stackoverflow предназначен для вопросов, которые совершенно очевидны, когда вы следовали некоторым учебникам для начинающих? Кроме того, начните с bndtools, а не с низкоуровневого API запуска, чтобы вы могли сначала изучить концепции, прежде чем пытаться их изменить.   -  person Peter Kriens    schedule 23.08.2013


Ответы (1)


Способ убедиться, что классы загружаются загрузчиком классов OSGi, состоит в том, чтобы поместить их в пакеты и фактически использовать OSGi для их загрузки.

person Neil Bartlett    schedule 26.08.2013