1

Axis2 を使用して Web サービス クライアントを作成しました。クライアントを jar にパッケージ化して、他のいくつかのプロジェクトで使用できるようにしたいと考えています。クライアントは、Axis2 WS-Security モジュール「rampart」を使用します。このモジュール、rampart.mar (タイプミスではありません!) は、Axis の「リポジトリ パス」の「modules」というディレクトリに存在する必要があります。クライアントには、セキュリティ ポリシー ファイル policy.xml も必要です。これらの最後の 2 つの場所は Spring を介して注入されますが、変更される可能性がないため、それらを jar にパッケージ化したいと思います。

次のような File オブジェクトを注入すると:

<bean id="webserviceStubFactory" class="com.company.WebserviceStubFactory">
    <constructor-arg value="classpath:policy.xml"/>
</bean>

プロジェクトを直接実行/テストする場合は問題なく動作します。ただし、jar にパッケージ化すると、

java.io.FileNotFoundException: class path resource [policy.xml] cannot be resolved to absolute file path because it does not reside in the file system: jar:file:/path/to/webservice-0.8.jar!/policy.xml

これはよく知られた Spring の「問題」です。コンストラクター引数は Spring ClasspathResource インスタンスに解決され、getFile() をサポートしません。これは、File インスタンスが jar 内の何かを参照できないためです。これに対する解決策は非常に簡単です。コンストラクターを変更して、ファイルの代わりに Resource を取得し、InputStream を直接使用します。ただし、これは Axis2 リポジトリ パスでは機能しません。これは、リポジトリへのフル パスしか指定できず、Axis2 内部が Rampart.mar の場所を特定するためです。

したがって、質問は基本的に次のようになります。Spring を使用して jar 内にパスを挿入し (たとえそれが / のみであっても)、他のライブラリがそのパスから通常のファイルシステムであるかのように読み取られるようにすることは可能ですか? そうではないと思いますが、開発/テスト/運用環境に外部の「軸リポジトリ」をインストールし、rampart.mar のいくつかのコピーを配置する前に、確認したいと思います。

4

1 に答える 1

1

基盤となる JavaSE API の矛盾を隠すために Spring ができることは限られています。インターフェイスのさまざまなgetXYZメソッドにはResource、ドキュメントの警告があります。たとえば、getFile()次の場合です。

Throws:
    IOException - if the resource cannot be resolved as absolute file path, 
    i.e. if the resource is not available in a file system

JAR 内のリソースは「ファイルシステム上」にないため、これは機能しません。

あなたの場合、ファイルを操作するための Axis2 の要件を回避する必要がありますが、ファイルが存在することを手動で確認する必要があります。つまり、Resource.getInputStream()JAR リソースのコンテンツを抽出Fileしてローカル ファイルシステムの一時ファイルにコピーし、それを Axis2 に渡すため Fileに使用します。

于 2010-02-02T08:26:51.373 に答える