1

我有几个需要集成的 Web 服务,我可以通过使用 Maven 的 wsimport 插件构建 Web 服务客户端来做到这一点。所讨论的 Web 服务都引用企业通用模式文件,因此生成单独的客户端会导致重复代码,其中每个 Web 服务客户端 jar 都包含相同模式的实现。

我想减少这些冗余代码,所以我的第一个想法是构建一个独立的 jar ,只使用从公共模式生成的公共代码。这里的问题是,当我使用 maven 从 WSDL 生成 Web 服务客户端时,它仍然会为 WSDL 引用的所有模式构建代码 - 我如何告诉 maven不要为公共模式文件生成代码,因为代码已经在引用的库中?

我确实试过这个:

<resources>
    <resource>
        <directory>${basedir}/wsdl</directory>
        <excludes>
            <exclude>**/my_schema.xsd</exclude>
        </excludes>
    </resource>
</resources>

my_schema.xsd但是即使我为已经包含此代码的 jar 创建了依赖项, wsimport 仍会生成代码:

<dependencies>
    <dependency>
        <artifactId>MyCommonCode</artifactId>
        <groupId>com.myCompany</groupId>
        <version>1.0.0</version>
    </dependency>
</dependencies>
4

1 回答 1

1

我正在尝试的解决方案使用episodes。在通用模式的 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”)。下一步是将剧集文件复制到依赖于公共模式的 Web 服务,并将其作为绑定文件引用,如下所示:

<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>

我仍在对此进行测试,但它似乎有效。唯一尴尬的部分是将剧集文件移动到其他客户端,但可能有一种方法可以自动化。

于 2013-06-10T14:21:54.377 回答