如何从 Java 以编程方式加载 OSGI 片段及其捆绑包中的所有资源(配置文件等)?
我想通过 getResource() 访问资源,就好像它们在内部 Jar 中一样。
首先,您需要一个句柄来捆绑上下文。从那里你可以收听包引用,得到一个 Bundle 实例并使用它的类加载器来做你想做的事。
使用 Servlet 连接到包上下文和ServiceTracker来侦听出现的 osgi 包的示例
public class AnotherHelloWorldServlet extends HttpServlet {
private MessageService service = null;
private BundleContext context;
@Override
public void init(final ServletConfig config) throws ServletException {
super.init(config);
context = (BundleContext) config.getServletContext().getAttribute("osgi-bundlecontext");
final AnotherHelloWorldServlet servlet = this;
ServiceTracker tracker = new ServiceTracker(context,
MessageService.class.getName(), null) {
@Override
public Object addingService(final ServiceReference sref) {
log.infof("Adding service: %s to %s", sref, servlet);
service = (MessageService) super.addingService(sref);
return service;
}
@Override
public void removedService(final ServiceReference sref, final Object sinst) {
super.removedService(sref, service);
log.infof("Removing service: %s from %s", sref, servlet);
service = null;
}
};
tracker.open();
}
}
使用 ServiceReference,您可以调用getBundle()来获取捆绑实例,为此,getResource()可以获取您所要求的内容。
如果您不能使用 servlet 或类似的东西(=如果您在 Java EE/servlet 容器之外),那么我所知道的挂钩到捆绑上下文的标准方法并不多。在这种情况下,您可能需要求助于BundleContextProvider hack来获取它。