【问题标题】:How can I tell maven/wsimport to ignore certain schema files when generating code?如何告诉 maven/wsimport 在生成代码时忽略某些模式文件?
【发布时间】:2013-06-07 16:19:56
【问题描述】:

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

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

我确实试过这个:

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

【问题讨论】:

  • 您是否使用排除进行了过滤?或者由于某种原因这对您的情况不起作用
  • @greedybuddha:是的,我更新了我的测试示例。
  • 如果它们都在同一个地方生成并且它们最终生成了冗余代码,那么它们最终不是都会相互覆盖而没有任何重复代码吗?
  • 另外,如果你在命令行中使用 wsimport,你怎么能避免这种情况呢?
  • @tieTYT:我认为如果所有客户端都在同一个 maven 项目中生成,那可能是真的。 maven 项目和 Web 服务客户端之间的布局大多是 1:1(我认为原因是并非所有应用程序都需要所有客户端,因此决定使它们更加模块化)。如果我从命令行使用 wsimport,我不知道如何避免这种情况。

标签: java web-services maven wsimport


【解决方案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>

这里的关键是&lt;arguments&gt;-episode "${build.directory}/generated-sources/myCommonSchema.episode"&lt;/arguments&gt; - 这会生成一个剧集文件(在指定目录中名为“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>

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

【讨论】:

  • 剧集内容对你有用吗?我得到的只是在导入的模式中找不到元素。我什至已经将剧集内容添加到普通绑定文件中,只要我使用&lt;jxb:class ref="..." /&gt;,它就会开始失败。
  • @Michael-O:是的,对我有用。也许剧集文件的创建方式有问题?
  • 文件由JAXB生成,我无法控制。我坚持使用java.net/jira/browse/JAX_WS-368java.net/jira/browse/JAXB-514。真是让人头疼。
猜你喜欢
  • 2018-07-21
  • 1970-01-01
  • 2012-03-25
  • 2019-06-27
  • 1970-01-01
  • 2014-03-11
  • 1970-01-01
  • 1970-01-01
  • 2015-08-22
相关资源
最近更新 更多