针对具有常见类型的多个 WSDL 优化 WSImport

2022-09-04 23:35:51

我正在处理一个相当大的WS项目,涉及20多个不同的Web服务。这些 Web 服务虽然彼此独立,但共享一组相当大的常见类型。我们在构建脚本中使用 wsimport 作为 ant 目标来生成代理类。

问题:随着 WS(和相应的 WSDL)数量的增加,我们注意到代理类的构建时间一直在攀升。经过进一步调查(和分析),我们发现wsimport花费了很大一部分构建时间重复生成通用类型。它已经到了这样的地步,生成,编译和打包这些代理类及其常见类型大约需要15-20分钟。这对我们来说是一个问题,我们正在寻找缩短构建时间的方法。

问:有没有办法只生成一次公共类型?我已经研究了通过谷歌搜索找到的一些解决方案。其中一个涉及编写一个 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,我在其他情况下已经这样做了。


答案 2

推荐