バンドル内のすべてのリソース (構成ファイルなど) とともに OSGI フラグメントを Java からプログラムでロードするにはどうすればよいですか?
内部 Jar にあるかのように getResource() を介してリソースにアクセスしたいと思います。
まず、コンテキストをバンドルするためのハンドルが必要です。そこから、バンドル参照をリッスンし、バンドル インスタンスを取得し、そのクラスローダーを使用して必要なことを行うことができます。
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()を呼び出して、要求したものを取得できます。
サーブレットなどを使用できない場合 (= Java EE/サーブレット コンテナーの外にいる場合)、バンドル コンテキストにフックする標準的な方法はあまりありません。その場合、BundleContextProvider ハックに頼って取得する必要があるかもしれません。