Оптимизация WSImport для нескольких WSDL с общими типами

Я работаю над довольно крупным проектом WS, включающим более 20 различных WebServices. Эти веб-сервисы, будучи независимыми друг от друга, разделяют значительный набор общих типов. Мы используем wsimport как цель ant в нашей сборке script для создания прокси-классов.

Проблема: Поскольку количество наших WS (и соответствующих WSDL) увеличилось, мы заметили, что время сборки для наших прокси-классов поднимается довольно круто. При дальнейшем исследовании (и профилировании) мы выяснили, что огромная часть времени сборки была потрачена wsimport на многократное генерирование общих типов. Он дошел до того, что генерация, компиляция и упаковка этих прокси-классов и их общих типов занимает около 15-20 минут. Это проблема для нас, и мы ищем способы сократить время сборки.

Вопрос: Есть ли способ генерировать общие типы один раз? Я рассмотрел некоторые решения, найденные в Google. Один из них заключался в записи накопителя WSDL, который анализирует WSDL и объединяет их в один WSDL, поэтому wsimport вызывается только один раз. Еще один намекнул на использование файлов эпизодов, но дальнейшее исследование показало, что были проблемы с использованием этого подхода.

Примечание. Я видел несколько старых похожих вопросов, но ни у кого из них не было ответов.

wsimport несколько сгенерированных wsdl

Как сообщить wsimport, что отдельные файлы WSDL относятся к тем же классам объектов?

Ответ 1

Прежде всего, я бы использовал apache cxf для этой сборки, поскольку он может обрабатывать несколько WSDL одновременно и намного более современен. Он будет намного эффективнее и создаст лучшие классы. Во-вторых, я бы не стал беспокоиться об этом, если файлы WSDL сильно меняются. Вместо этого я бы поместил их в отдельный артефакт и построил их один раз, а затем импортировал в проект как свой артефакт. Единственное, что не было создано в этом архиве, должно быть тестовым кодом для тестирования конечных точек. Что касается сборки, то в конфигурацию плагина Maven, которую я использовал с большим успехом, вставлено ниже.

      <plugin>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-codegen-plugin</artifactId>
    <version>${apache.cxf.version}</version>
    <executions>
      <execution>
        <id>generate-sources</id>
        <phase>generate-sources</phase>
        <configuration>
          <sourceRoot>${project.build.directory}/generated-sources/</sourceRoot>
          <defaultOptions>
            <catalog>${wsdlDir}/jax-ws-catalog.xml</catalog>
            <bindingFiles>
              <bindingFile>${wsdlDir}/jaxb-bindings.xml</bindingFile>
              <bindingFile>${wsdlDir}/jaxws-bindings.xml</bindingFile>
            </bindingFiles>
            <noAddressBinding>true</noAddressBinding>
            <extraargs>
              <extraarg>-client</extraarg>
              <extraarg>-xjc-Xbug671</extraarg>-->
              <extraarg>-xjc-mark-generated</extraarg>
            </extraargs>
          </defaultOptions>
          <wsdlOptions>
            <wsdlOption>
              <wsdl>${wsdlDir}/cis.wsdl</wsdl>
            </wsdlOption>
          </wsdlOptions>
        </configuration>
        <goals>
          <goal>wsdl2java</goal>
        </goals>
      </execution>
    </executions>
    <dependencies>
      <dependency>
        <groupId>org.apache.cxf.xjcplugins</groupId>
        <artifactId>cxf-xjc-bug671</artifactId>
        <version>${apache.cxf.xjc.version}</version>
      </dependency>
    </dependencies>
  </plugin>

Это настроено для генерации только из одного WSDL, но можно легко добавить больше WSDL, и я сделал это в других обстоятельствах.