Как я могу сказать 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>

Я все еще тестирую с этим, но, похоже, работает. Единственная неловкая часть - это передача файла эпизода другим клиентам, но, вероятно, есть способ автоматизировать это.

Другие вопросы по тегам