Spring OSGI ClassPathリソースの問題
質問
OSGI(Fuse ESB)にスプリングベースのバンドルを展開しようとしています。Springコンテキストでは、リソースフォルダー内のDB4Oファイルを参照しています。私の理解によると、Mavenプロジェクトは、Resourcesフォルダーの下で利用可能なファイルがProject ClassPathで利用可能になることを確認します。ファイルはリソース/メタ-INF/spring/repo/test.db4oの下に保持しています。
これが春のコンテキストのエントリです。
<bean id="objectContainer" class="org.springmodules.db4o.ObjectContainerFactoryBean">
<property name="databaseFile" value="classpath:META-INF/spring/repo/test.db4o" />
</bean>
インストールしてアプリケーションを起動しようとすると、次の例外が得られます。
java.io.FileNotFoundException: OSGi resource[classpath:META-INF/spring/repo/test.db4o|bnd.id=258|bnd.sym=taxonomydaoimplbundle] cannot be resolved to absolute file path because it does not reside in the file system: bundle://258.0:1/META-INF/spring/repo/test.db4o
私はさまざまな組み合わせを試しましたが、OSGIはこのファイルを認識していないようです。ポインターは大歓迎です。
-ありがとう
解決
私は最終的に問題を見つけました。 ObjectContainerFactoryBeanは、OsgiresourceBundleに依存して、リソースをファイルオブジェクトとしてロードしています。 osgiresourcebundleはgetFile()と呼ばれるメソッドを公開していますが、OSGI環境で意図されているようには機能しません。 URIがプロトコル「バンドル」を持っているために返されるリソースは常にファイルプロトコルを期待します。したがって、例外はスローされています。回避策は、inputstreamまたはgetUrlを使用することです。 ObjectContainerFactoryBeanのソースコードを持っていなかったため、ファイルを入力ストリームとしてロードする独自の実装を提供するために、このクラスを拡張する必要がありました。
所属していません StackOverflow