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 のいくつかのコピーを配置する前に、確認したいと思います。