【发布时间】:2014-11-23 20:00:59
【问题描述】:
我花了很长时间学习 OSGi,但我仍然觉得好像缺少一个关键的拼图。
这是我的用例:
我正在使用 JAX-RS (Grizzly) 创建一个 REST API。我有一个具有许多不同实现的接口。我的解决方案应该能够随时添加新的实现。
根据某种形式的输入,我必须掌握这些特定实例中的一个。例如,假设我使用 Felix Interface A 和 Interface B 注册了两个接口实现。用户应该可以请求Implementation B
通过使用运行felix.jar(Apache Felix Gogo) 得到的命令行,我已经能够安装和启动我自己的包。我现在面临的问题是我应该如何从我的一个控制器中检索这些实现中的任何一个。
这是我的一个实现的激活器的代码。
public class MyClassActivator implements BundleActivator {
@Override
public void start(BundleContext context) throws Exception {
System.out.println("Starting ImplementationA");
Hashtable<String, String> props = new Hashtable<>();
props.put("Identifier", "ImplementationA");
context.registerService(MyInterface.class.getName(), new MyClassA(), props);
}
@Override
public void stop(BundleContext context) throws Exception {
System.out.println("Stopping ImplementationA");
}
private class ImplementationA implements MyInterface {
/*my implementation*/
}
}
从我的一个 JAX-RS 类中,我想以某种方式这样做:
MyInterface myclassA = getBundle("ImplementationA");
字符串ImplementationA 与我放置在道具地图中的字符串相同。
到目前为止我尝试过的是
BundleContext bc = FrameworkUtil.getBundle(MyInterface.class).getBundleContext();
然而,这只是返回 null,它似乎并没有真正与我的 felix 实例“交谈”。
所以我的问题是如何从 Felix 获得接口?我想用 OSGi 做些什么吗?
【问题讨论】:
标签: java osgi apache-felix