Недавно я начал использовать 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?