Упаковка клиента веб-службы Axis2, управляемого Spring - PullRequest
1 голос
/ 01 февраля 2010

Я создал клиент веб-службы, используя Axis2. Я хотел бы упаковать клиента в банку, чтобы я мог использовать его в нескольких других проектах. Клиент использует модуль Axis2 WS-Security «rampart». Этот модуль, rampart.mar (не опечатка!), Должен присутствовать в 'пути к хранилищу' Axis, в каталоге с именем 'modules'. Клиенту также требуется файл политики безопасности, policy.xml. Местоположения этих двух последних вводятся через Spring, но, поскольку они не подлежат изменению, я хотел бы упаковать их в банку.

Если вы внедрите объект File, например:

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

все будет работать нормально при запуске / тестировании проекта напрямую. Однако, когда вы упаковываете его в банку, вы получаете

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-проблема: arg-конструктор разрешается в экземпляр Spring ClasspathResource и не поддерживает getFile (), поскольку экземпляры File не могут ссылаться на что-то внутри jar-файла. Решение этого довольно простое: измените конструктор, чтобы он использовал Resource вместо файла, и используйте InputStream напрямую. Однако это не работает для пути к хранилищу Axis2, так как я могу указать только полный путь к хранилищу, и внутреннее устройство Axis2 выяснит, где находится rampart.mar.

Итак, вопрос сводится к следующему: возможно ли использовать Spring для вставки пути внутри jar-файла (даже если он только /) и других библиотек, считанных из этого пути, как если бы это была обычная файловая система? Я предполагаю, что это не так, но я хотел бы быть уверен, прежде чем устанавливать внешние «репозитории осей» в среде dev / test / production и располагать несколько копий rampart.mar.

1 Ответ

1 голос
/ 02 февраля 2010

Spring может сделать так много, чтобы скрыть несоответствия базового API JavaSE. Различные методы 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 в локальной файловой системе, а затем передать , что File, в Axis2.

...