Управление значением атрибута JAX-WS wsdlLocation (абсолютный путь) с помощью jaxws-maven-plugin
У меня есть веб-сервис с поддержкой JAX-WS, WSDL которого мы создаем клиент веб-службы из другого модуля Maven (который я буду называть ws-consumer
).
К лучшему или худшему, мы копируем "опубликованные WSDL" (версию WSDL и XSD, которые служба хранится/сгенерирована в точке выпуска) в нашу папку src/wsdl
ws-consumer
а затем используйте jaxws-maven-plugin
из org.jvnet для создания клиента с использованием jaxws:wsimport
со следующей (усеченной) конфигурацией:
<plugin>
<groupId>org.jvnet.jax-ws-commons</groupId>
<artifactId>jaxws-maven-plugin</artifactId>
<version>2.1</version>
<executions>
<execution>
<!--phase>generate-sources</phase -->
<goals>
<goal>wsimport</goal>
</goals>
<configuration>
<wsdlDirectory>src/main/resources/META-INF/wsdl/</wsdlDirectory>
<wsdlFiles>
<wsdlFile>MyWS/MyWS.wsdl</wsdlFile>
</wsdlFiles>
</configuration>
</execution>
</executions>
</plugin>
Теперь сформированный клиентский код имеет следующие аннотации, применяемые на уровне класса:
@WebServiceClient(name = "MyWS", targetNamespace = "http://myws/blah", wsdlLocation = "**file:/C:/some/absolute/path/src/main/resources/META-INF/wsdl/MyWS/MyWS.wsdl"**)
акцент мой
Как вы можете надеяться, wsdlLocation
атрибута wsdlLocation
имеет wsdlLocation
кодированный абсолютный путь, который будет неправильным при развертывании службы.
Могу ли я "контролировать" это, установив его только в META-INF/wsdl/MyWS/MyWS.wsdl
или какое-то другое значение?
Ответы
Ответ 1
Это возможно с помощью плагина Codehaus:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxws-maven-plugin</artifactId>
<version>1.9</version>
<executions>
<execution>
<goals>
<goal>wsimport</goal>
</goals>
</execution>
</executions>
<configuration>
<keep>true</keep>
<verbose>true</verbose>
<wsdlDirectory>../wscontract/src/main/resources/wsdl</wsdlDirectory>
<wsdlLocation>wsdl/MaintainAddress.wsdl</wsdlLocation>
<sourceDestDir>src/main/java</sourceDestDir>
<bindingDirectory>.</bindingDirectory>
<bindingFiles>
<bindingFile>jaxb/xsdbindings.xml</bindingFile>
<bindingFile>jaxb/wsdlbindings.xml</bindingFile>
</bindingFiles>
</configuration>
</plugin>
Возможно, у плагина, который вы используете, есть аналогичный вариант, или вы можете рассмотреть возможность переключения.
Вы также можете указать свой WSDL явно, и в этом случае это свойство игнорируется, хотя это может быть неприменимо в приложении, управляемом контейнером.
Пример кода здесь.
Ответ 2
Используйте wsdlLocation с помощью jaxws-maven-plugin из org.jvnet.jax-ws-commons:
<plugin>
<groupId>org.jvnet.jax-ws-commons</groupId>
<artifactId>jaxws-maven-plugin</artifactId>
<version>2.3</version>
<executions>
<execution>
<goals>
<goal>wsimport</goal>
</goals>
</execution>
</executions>
<configuration>
<wsdlDirectory>src/main/resources/wsdl</wsdlDirectory>
<wsdlFiles>
<wsdlFile>arsdev.wsdl</wsdlFile>
</wsdlFiles>
<wsdlLocation>wsdl/*</wsdlLocation>
<!-- Keep generated files -->
<keep>true</keep>
<packageName>jaxws.remedy.client.generated</packageName>
<!-- generated source files destination -->
<sourceDestDir>target/generated-code/src</sourceDestDir>
</configuration>
</plugin>
Ответ 3
Я голосовал за ответ @dean-schulze, поскольку он подходит для случая org.jvnet.jax-ws-commons: плагин jaxws-maven- plugin.
Также может быть интересно отобразить справочную информацию локально с помощью CLI, например:
mvn jaxws:help -Dgoal=wsimport -Ddetail
Как сказано в предыдущем ответе, мы можем использовать параметр wsdlLocation, описанный здесь:
wsdlLocation
@WebService.wsdlLocation and @WebServiceClient.wsdlLocation value.
Can end with asterisk in which case relative path of the WSDL will be
appended to the given wsdlLocation.
Example:
...
<configuration>
<wsdlDirectory>src/mywsdls</wsdlDirectory>
<wsdlFiles>
<wsdlFile>a.wsdl</wsdlFile>
<wsdlFile>b/b.wsdl</wsdlFile>
<wsdlFile>${basedir}/src/mywsdls/c.wsdl</wsdlFile>
</wsdlFiles>
<wsdlLocation>http://example.com/mywebservices/*</wsdlLocation>
</configuration>
...
wsdlLocation for a.wsdl will be http://example.com/mywebservices/a.wsdl
wsdlLocation for b/b.wsdl will be
http://example.com/mywebservices/b/b.wsdl
wsdlLocation for ${basedir}/src/mywsdls/c.wsdl will be
file://absolute/path/to/c.wsdl
Note: External binding files cannot be used if asterisk notation is in
place.
Опция -wsdllocation также зарегистрирована в команде wsimport из JDK:
Но он просто говорит (см. @WebServiceClient javadoc):
Specifies the @WebServiceClient.wsdlLocation value.
Ответ 4
Версия 1.12 не распознает <wsdlLocation>
. Он жалуется:
No WSDLs are found to process, Specify atleast one of the following parameters: wsdlFiles, wsdlDirectory or wsdlUrls.
Версия 1.9 (как в вашем примере) просто игнорирует все и не создает никакого кода.
Что-то должно измениться.