我最近开始使用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类加载器加载?
答案 0 :(得分:1)
确保类被OSGi类加载器加载的方法是将它们放在bundle中并实际使用OSGi来加载它们。