优化 WSImport 处理多个包含共同类型的 WSDL 的方法

13

我正在从事一个相当大的Web Services项目,涉及超过20个不同的WebServices。这些Web Services虽然相互独立,但共享一组相当大的公共类型。我们在构建脚本中使用wsimport作为Ant目标来生成代理类。

问题: 随着我们Web Services(和相应的WSDL)数量的增加,我们注意到代理类的构建时间正在急剧上升。经过进一步的调查(和分析),我们发现wsimport花费了大量的时间来重复生成公共类型。现在已经达到一个点,生成、编译和打包这些代理类和它们的公共类型需要大约15-20分钟。这对我们来说是一个问题,我们正在寻找缩短构建时间的方法。

问题: 是否有一种方法只生成公共类型一次?我已经看过一些通过Google找到的解决方案。其中一个涉及编写一个,将WSDL解析并合并成单个WSDL,以便只调用一次wsimport。另一个暗示使用,但进一步的调查只得出使用该方法存在问题。

注:我看到一些旧的类似问题,但其中没有任何答案。

wsimport multiple generated wsdl's

How can I tell wsimport that separate WSDL files are referring to the same object classes?


你尝试过使用-keep选项吗? - user1428716
你将无法完成它... WSDL累加器是你最好的选择,但你不喜欢它,你也可以使用绑定来跳过后续WSDL中常见类型的生成。关键是每次构建生成工件没有任何优势...只需将生成的类保留为源代码(在单独的JAR文件中或不是,根据您的喜好)。 - cocorossello
1个回答

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,并且我在其他情况下已经这样做了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接