HTTP OSGi service から起動される Web アプリケーションを開発しようとしています。このアプリケーションは、BundleContext
. Web アプリケーションで OSGi コンテキストを取得するために、次の 2 つの異なる方法を試しました。
- のを、Web サービスがインポートして使用できるクラスの静的フィールドに
BundleContext
格納します。Activator
FrameworkUtil.getBundle(this.getClass()).getBundleContext()
( Web アプリケーションのクラスであるthis
のインスタンス) を使用します。MainPage
最初のオプションは完全に間違っていると思いますが、とにかく両方のオプションでクラスローダーに問題があります。2番目のものでは、次のようになりますLinkageError
:
java.lang.LinkageError: loader constraint violation: loader (instance of org/apache/felix/framework/ModuleImpl$ModuleClassLoader) previously initiated loading for a different type with name "com/db4o/ObjectContainer"
Equinox でも試してみましたが、同様のエラーが発生しました。
java.lang.LinkageError: loader constraint violation: loader (instance of org/eclipse/osgi/internal/baseadaptor/DefaultClassLoader) previously initiated loading for a different type with name "com/db4o/ObjectContainer"
例外を引き起こすコードは次のとおりです。
ServiceReference reference = context.getServiceReference(Db4oService.class.getName());
Db4oService service = (Db4oService)context.getService(reference);
database = service.openFile("foo.db");
最後の行で例外が発生します。database
クラスはObjectContainer
、この変数の型をObject
例外に変更すると、発生しませんが、Object
:)としては役に立ちません
更新: db4o の代わりに他のサービスを使用しようとしましたが、期待どおりに機能しました。おそらく、db4o OSGi バンドルが独自のクラスをロードするときに奇妙な動作をするか、正しく使用していない可能性があります。非 Web バンドルから使用する場合にも機能します。