サーブレットを OSGI バンドルで拡張可能にしようとしています。新しく追加されたバンドルもサーブレットでなければなりません。Felix http://felix.apache.org/documentation/subprojects/apache-felix-http-service.htmlによって提供されるサーブレット ブリッジ機能があります。Felix の Web ページにあるように、サーブレット ブリッジをセットアップするには、次のことを行う必要があります。
- Web アプリケーション (WEB-INF/lib) 内に org.apache.felix.http.proxy jar ファイルをデプロイします。[終わり]
- 起動リスナー (ServletContextListener など) で、BundleContext をサーブレット コンテキスト属性として設定[DONE]
- web.xml 内で org.apache.felix.http.proxy.ProxyServlet を定義し、すべてのリクエストでサービスを提供するように登録します[DONE]
- org.apache.felix.http.proxy.ProxyListener を web.xml で として定義して、HTTP セッション関連のイベントを転送できるようにします[完了]
- 必ず javax.servlet;javax.servlet.http;version=2.6 を OSGi システム パッケージに追加してください [必須ではありません]
- OSGi フレームワーク内に org.apache.felix.http.bridge (または org.apache.felix.http.bundle) をデプロイします[????]
私の場合、手順 6 ではサーブレット ブリッジを機能させるには不十分なようです。バンドル サーブレットに対してすべての手順 1 ~ 5 を実行しました。私のメイン サーブレットには OSGI 組み込みメカニズムがあるため、Java コードからバンドルをデプロイします。これは OSGI ランチャーのコードの一部です。
Map m = new HashMap();
m.putAll(System.getProperties());
m.put(Constants.FRAMEWORK_STORAGE_CLEAN, "onFirstInit");
m.put(Constants.FRAMEWORK_SYSTEMPACKAGES, "org.osgi.service.http");
fwk = getFrameworkFactory().newFramework(m);
fwk.start();
// Install bundle JAR files and remember the bundle objects.
BundleContext ctxt = fwk.getBundleContext();
for (int i = 0; i < jars.size(); i++) {
Bundle b = ctxt.installBundle(((File) jars.get(i)).toURI().toString());
bundleList.add(b);
}
// Start all installed non-fragment bundles.
for (int i = 0; i < bundleList.size(); i++) {
if (!isFragment((Bundle) bundleList.get(i))) {
((Bundle) bundleList.get(i)).start();
}
}
メインのサーブレット コードから、必要なorg.apache.felix.http.bridge
バンドル、サーブレット バンドルのいくつかの依存関係 (slf4j、javax.servlet...)、および手順 1 ~ 5 に従って作成したサーブレット バンドルをインストールします。デプロイの結果: サーブレット バンドルで使用できる HttpService がありません。アプリケーションで使用できないため、サーブレット バンドルにサーブレット インスタンスを登録する方法がありません。
MANIFEST.MF を見ると、次のorg.apache.felix.http.bridge
ような言及は見つかりませんでしたExport-Service: org.osgi.service.http.HttpService
。このバンドルを使用するにはどうすればよいですか? サーブレット ブリッジをセットアップするにはどうすればよいですか?