2010-11-25 15 views
3

私は、レガシーWebアプリケーションから作成したwar osgiバンドルを持っています。私が持っている問題は、春の設定ではクラスパス(以下を参照)にあるファイルへの参照があります。これはlegacy warがTomcatに配備されたときにうまくいきます。しかし、osgiにはファイルシステムの概念がないため、これらのファイルを見つけることができず、ファイルが見つかりません。私がこのクラスまたは同様の方法でクラスのリソースをロードし続けることができれば、誰でも私に電話してください。または、exmpleのためにorg.springframework.osgi.io.OsgiBundleResourceを使用してプログラムでロードする必要がありますか?バンドル内のリソースをロードするためのSpring設定

<bean id="manager" class="com.xyz.abc.Manager" depends-on="workflowCache"> 
    <property name="configuration" value="classpath:com/xyz/abc/resource/workflow.xml"/> 
</bean> 

ありがとうございます。

+0

これを解決しましたか? ResoureceUtilsでファイルプロトコルを探しているのと同じエラーが出ます。 –

答えて

1

ここでの問題は、OSGiにはファイルシステムの概念がなく、もはやクラスパス上にないということはほとんどありません。

warが通常のtomcatで実行されるとき、あなたが参照するworkflow.xmlはファイルシステム上にあり、tomcatクラスパス経由でアクセス可能であると仮定します。 WARのクラスローダーは、親クラスローダーに委譲します。このクラスローダーは、workflow.xmlファイルにアクセスできます。

OSGiでは、クラスパスはバンドルクラスパスとパッケージのインポート、またはバンドル要件によって定義されます。このworkflow.xmlファイルは、これらのメカニズムのいずれによってもアクセスできないことは明らかです。

いくつかのオプションがあります:

  1. は、バンドル内のworkflow.xmlを入れて、バンドル・クラスパス上に置きます。これは、WABを再構築せずにファイルを編集できるようにしたい場合にはあまり役に立ちません。
  2. OSGiフレームワークを起動するときに、workflow.xmlファイルをクラスパスに追加します。次に、フレームワーク起動オプションとしてorg.osgi.framework.bootdelegationをcom.xyz.abc.resourceに設定します。これを行うと、OSGiフレームワークからcom.xyz.abc.resourceをロードすることができなくなります。フレームワークの親クラスローダーからロードすることはできません。
  3. エクイノックスを使用している場合は、外部ファイルBundle-Classpath内のファイルパスの先頭にexternal:を追加することにより、バンドルクラスパス上に追加します。あなたのバンドルは他の場所ではうまくいかないので、やや人工的です。

これらはすべて少しハッキーなので、このファイルをロードする方法を見てみるとよいでしょう。私はOsgiBundleResourceに慣れていない。

OSGiで実行している場合は、Spring DMに基づいたBlueprint Containerの仕様を参照してください。私が知っている2つの実装、Apache Aries、Eclipse Geminiがあります。

+0

お返事ありがとうございます。このファイルはバンドルクラスパス上のパッケージにあります。バンドルのクラスパスを更新して、パッケージに含まれる完全パス(最初はWEB-INF/classesと組み込みjarへのパスが含まれていました)を更新しましたが、まだ使用できません。 ResourceUtilsのif(!URL_PROTOCOL_FILE.equals(resourceUrl.getProtocol()))のように、ファイルがbundleresourceと等しいかどうかを比較しているので、問題がこの行にあるようです。その後、FileNotFoundExceptionがスローされます。 – Barry

1

みんな、私も同様の問題がありました。それは論理的な理由のようですませんが、ファイルがクラスパス上にあったので、それは、働いていたと春分はそれを見つけることができませんでした

- (>ファイル変更クラスパス)だから私はこれを試してみましたclasspath:を使用してファイルを見つけましたが、ファイルを使用してファイルを見つけました。

論理的な理由が見つかるまで、これを使用することができます。