1

OSGi フレームワークを調べた後、サンプル Web アプリケーションを開発しました。Web アプリケーション バンドル (.war または .jar) は、eba 内にパッケージ化されています。war ファイルには、そのディレクトリに多数の埋め込み jar ファイルが含まれています。これらの jar は、jar 間の関係に従って、必要なエクスポートおよびインポート パッケージとともにWEB-INF/lib OSGi バンドルに変換されています。ここで、bundle-classpath で(using maven-bundle-pluginこれらすべての jar について言及する必要さえあります。(WEB-INF/lib)上記が機能するのは、バンドル (wab もバンドル) に 1 つ以上の jar ファイルを含めることができ、Bundle-Classpath manifest.mf エントリを使用してそれらを指すことができるためです。

bundle-classpath に jar を含めない場合は、ClassNotFoundException.

問題は、jar を osgi バンドルに変換しても意味がないということです。明らかに、すべての jarWEB-INF/libは同じクラス ローダー (つまり、wab のクラス ローダー) によってロードされます。バンドルクラスローダーの概念ごと?

4

1 に答える 1

1

jar を WEB-INF/lib 内に配置することは、依存関係を処理する古いスタイルの通常の Java の方法であり、戦争の外に配置することは、それらを処理する新しいスタイルの OSGi の方法です。

war の依存関係を WEB-INF/lib にパッケージ化することで、それらを通常の jar として扱います (バンドルも jar であることを思い出してください)。その場合、バンドルを使用してもあまり意味がなかったのはあなたの言う通りです。

war の代わりに wab を使用する利点の 1 つは、恐ろしい 100 Mb のモノリシック戦争から逃れることです。バンドルを WEB-INF/lib 内にパッケージ化するのではなく、war に Import-Package: を使用して必要なパッケージをインポートさせ、依存関係を eba 内にパッケージ化してみてください。(war に必要なパッケージをインポートさせることを覚えていない場合、OSGi コンテナーは war がそれらのパッケージを必要としていることを認識しないため、表示されていた class not found 例外が発生します。)

于 2014-03-22T07:22:40.107 に答える