如何从Java中以编程方式加载OSGI片段及其包中的所有资源(配置文件等)?
我想通过getResource()访问资源,就像它们在内部Jar中一样。
答案 0 :(得分:0)
首先,您需要一个捆绑上下文的句柄。从那里你可以听到捆绑引用,得到一个Bundle实例并使用它的类加载器来做你想要的。
使用Servlet挂钩到bundle上下文和ServiceTracker来监听osgi bundle出现的示例
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容器之外),那么没有那么多标准方法可以挂钩我知道的bundle上下文。在这种情况下,您可能需要求助BundleContextProvider hack来获取它。