Как я могу сказать maven/wsimport игнорировать определенные файлы схемы при генерации кода?
У меня есть несколько веб-сервисов, с которыми мне нужно интегрироваться, и я могу сделать это путем создания клиентов веб-сервисов с помощью плагина wsimport для Maven. Все рассматриваемые веб-службы ссылаются на файлы общей корпоративной схемы, поэтому создание отдельного клиента приводит к дублированию кода, где каждый jar-файл веб-службы содержит реализацию одной и той же схемы.
Я хотел уменьшить этот избыточный код, поэтому моей первой мыслью было создать автономный jar-файл только с общим кодом, сгенерированным из общей схемы. Проблема здесь в том, что когда я использую maven для генерации клиента веб-службы из WSDL, он все равно будет создавать код для всех ссылок на схемы WSDL - как я могу сказать maven не генерировать код для общих файлов схемы, потому что код уже есть в указанной библиотеке?
Я попробовал это:
<resources>
<resource>
<directory>${basedir}/wsdl</directory>
<excludes>
<exclude>**/my_schema.xsd</exclude>
</excludes>
</resource>
</resources>
Но wsimport все еще генерирует код для my_schema.xsd
хотя я создал зависимость для jar, который уже содержит этот код:
<dependencies>
<dependency>
<artifactId>MyCommonCode</artifactId>
<groupId>com.myCompany</groupId>
<version>1.0.0</version>
</dependency>
</dependencies>
1 ответ
Решение, которое я пробую, использует эпизоды. В файле POM для общей схемы у меня есть что-то вроде этого:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxb2-maven-plugin</artifactId>
<version>1.5</version>
<executions>
<execution>
<goals>
<goal>xjc</goal>
</goals>
<configuration>
<bindingDirectory>${basedir}/src/bindings</bindingDirectory>
<!-- The schema directory or xsd files. -->
<schemaDirectory>${basedir}/src/schema</schemaDirectory>
<!-- The working directory to create the generated java source files. -->
<outputDirectory>${build.directory}/generated-sources/jaxb</outputDirectory>
<arguments>-episode "${build.directory}/generated-sources/myCommonSchema.episode"</arguments>
</configuration>
</execution>
</executions>
</plugin>
Ключ здесь <arguments>-episode "${build.directory}/generated-sources/myCommonSchema.episode"</arguments>
- это создает файл эпизода (с именем "myCommonSchema.episode" в указанном каталоге). Следующим шагом является копирование файла эпизода в веб-сервис, который зависит от общей схемы, и ссылка на него как файл привязки, например так:
<plugin>
<groupId>org.jvnet.jax-ws-commons</groupId>
<artifactId>jaxws-maven-plugin</artifactId>
<version>2.2</version>
<executions>
<execution>
<id>MyService</id>
<goals>
<goal>wsimport</goal>
</goals>
<configuration>
<bindingDirectory>${basedir}/src/</bindingDirectory>
<bindingFiles>
<bindingFile>myCommonSchema.episode</bindingFile>
</bindingFiles>
<wsdlDirectory>${basedir}/src/wsdl/MyWebService</wsdlDirectory>
<wsdlFiles>
<wsdlFile>MyWebService.wsdl</wsdlFile>
</wsdlFiles>
<wsdlLocation>META-INF/wsdl/MyWebService/MyWebService.wsdl</wsdlLocation>
<sourceDestDir>${project.build.directory}/generated-sources/wsimport</sourceDestDir>
<verbose>true</verbose>
<xdebug>true</xdebug>
<extension>true</extension>
<xjcArgs>
<xjcArg>-Xannotate</xjcArg>
</xjcArgs>
</configuration>
</execution>
Я все еще тестирую с этим, но, похоже, работает. Единственная неловкая часть - это передача файла эпизода другим клиентам, но, вероятно, есть способ автоматизировать это.