Я создал клиент веб-службы, используя 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.