14

OSGI Enterprise Release 5 仕様の第 126 章では、互換性について言及しています。

「Java SE および Java EE クライアントで使用される従来の JNDI プログラミング モデルをサポートします。」

OSGI 非認識コードの使用:

「OSGi を認識しないクライアントと JNDI コンテキスト プロバイダーは、静的メソッドを使用して JRE JNDI 実装に接続します。InitialContext クラスはプロバイダーからコンテキストへのアクセスを提供し、プロバイダーは静的な NamingManager メソッドを使用してオブジェクト変換を行い、URL コンテキストを検索します。これは、従来のモデルは OSGi を認識していないため、この OSGi 認識の欠如の結果が管理されている場合にのみ、確実に使用できます。」

しかし、このテキストが OSGI バンドル内で実行される「レガシー」コードにのみ適用されるのか、それとも OSGI コンテナがアプリケーションに埋め込まれているシナリオなどの OSGI コンテナ外のコードにも適用されるのかは、私には明らかではありません。

埋め込みシナリオでは、OSGI コンテナーの外側と内側の両方に JNDI 呼び出しを実行するアプリケーション コードが存在する場合があり、それらは同じ JVM で実行されるため、JNDI 実装を共有します。

質問:組み込み OSGI コンテナーで実行されている OSGI JNDI 実装は、コンテナー外の OSGI 非認識コードが通常のように JNDI 呼び出しを実行できるようにする必要がありますか?それとも、「OSGI 認識」への移植が必要ですか?

Apache Karaf 2.3.0 (Apache Aries JNDI 1.0.0 を使用) でこれを自分で試してみると、Apache Aries では JNDI クライアント呼び出しが OSGI バンドルから発信される必要があるため、うまくいかないようです。
部分的なスタック トレース:

javax.naming.NoInitialContextException: The calling code's BundleContext could not be determined.
    at org.apache.aries.jndi.OSGiInitialContextFactoryBuilder.getInitialContext(OSGiInitialContextFactoryBuilder.java:46)
    at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:684)
    at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:307)
    at javax.naming.InitialContext.init(InitialContext.java:242)
    at javax.naming.InitialContext.<init>(InitialContext.java:192)

質問:これは正しい動作ですか、それとも、この制限に違反している、参照できる仕様のセクションはありますか?

4

3 に答える 3

0

問題を正しく理解しているかどうかわかりません... JNDI はサービス プロバイダー インターフェイスであり、実行するにはいくつかの基本的な実装が必要です。必要なのは、OSGI コンテナーをプロビジョニングすることだけです。

JNDI に必要なすべての jar を含む単一のバンドルを作成し、すべてのパッケージをエクスポートすることをお勧めします。次に、Dynamic-Import: * を使用して使用します。私たちの場合 (EJB 呼び出しに JBoss 5 JNDI を使用する Eclipse RCP アプリケーション) では機能しました。

ただし、コンテナーの内外で JNDI が必要であり、クラスローディングに苦労したくない場合は、すべての jar をアプリケーションのクラスパスに追加することをお勧めします。このようにして、アプリケーション全体でアクセスできるようにする必要があります。

于 2012-12-22T15:59:32.177 に答える