使用带有-clientjar选项的jaxws-maven-plugin

时间:2014-01-14 13:57:18

标签: java maven wsimport

我正在使用jaxws-maven-plugin为Web服务使用者应用程序执行wsimport。我在2010年使用JAX-WS 2.2.2 RI引入的wsimport上使用-clientjar选项。我这样做是因为我想在jar中捆绑WSDL。

我在制作pom时没有问题。对于插件配置,我执行以下操作:

<configuration>
    ...
    <args>
        <arg>-clientjar</arg>
        <arg>bundled-wsdl.jar</arg>
    </args>
</configuration>

当我执行构建我创建的jar时,我们称之为myapp.jar,其中包含文件bundled-wsdl.jar。在bundled-wsdl.jar的META-INF目录中,我发现wsdl和xsd就像我喜欢它们一样。我对使用-clientjar选项产生的生成的java代码也很满意。到目前为止一切都很好。

但是这些东西应该在myapp.jar的META-INF中,对吧? 事实上,它位于bundled-wsdl.jar的META-INF中并没有给我带来太多帮助。

有趣的是,我确实在myapp.jar的META-INF中获得了一个wsdl文件,这使得该应用程序实际上可行。怎么到达那里我不知道。此外,xsd文件不存在,仅在bundled-wsdl.jar的META-INF。

基本问题是如何在Maven项目中正确使用wsimport -clientjar选项?

Java 1.7.0_45。

2 个答案:

答案 0 :(得分:4)

-clientjar选项的记录很少,恕我直言。 以下是我相信它的工作原理:

使用-clientjar <jarfile>选项时发生了三次事件:

  1. 您将在指向的目录中生成<jarfile> -d工具的wsimport参数。这将包含在内 它既包括WSDL,也包括任何相关的XSD文件。这个小包不会用于任何东西。如果你想使用它,那完全取决于你。但在你看到下面的(2)之前。除了作为一种文档形式之外,我不确定该jar文件的用途。
  2. 您将获得放入名为的文件的WSDL副本 META-INF/wsdl/<svcname>.wsdl。生成的类将使用它 no-arg代理构造函数中的文件。所以这就是实际的 如果您使用-clientjar请求捆绑的WSDL文件,则使用 选项。
  3. 生成的代码将更改,以便wsdlLocation,如果您在@WebServiceClient类上使用默认的无参数构造函数,将是捆绑的WSDL(来自(2)),而不是比远程WSDL。实际上,如果您在命令行中使用-wsdllocation-clientjar,那么您使用-wsdllocation指定的任何内容都将无效,因为-clientjar优先。
  4. 所以我们必须关注(2)和(3),因为它是唯一实际使用的......至少如果你按原样使用生成的代码。

    值得注意的是,(2)的结果只是 一个WSDL文件。此文件可能已嵌入到XSD文件的链接,但据我所知,此链接永远不会被遵循。原因是当我们说Web服务使用者在运行时需要WSDL时,它实际上只需要WSDL本身,而不是模式。架构是&#34;硬编码&#34;进入消费者并且无法在运行时更改它。因此,没有理由在运行时读取模式信息。 (这是我的理解)

    关于(2)中包含的WSDL的第二件事:它实际上只是原始WSDL的副本,因此它可能没有您想要的端点。实际上在大多数情况下它不会。这意味着在这种情况下,您需要自己设置端点:

    // Use no-arg constructor. Means it uses the WSDL bundled into the 
    // META-INF/wsdl directory rather than trying to retrieve WSDL over the
    // network.
    service = new HelloSvc_Service();
    hello = service.getHelloSvcPort();
    
    // Since we're using a bundled WSDL the web service URL cannot 
    // be derived from that (it would be wrong!). So we have to set
    // it explicitly.
    ((BindingProvider) hello).getRequestContext().put(
                    BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
                    "http://myhellowebservice-address");
    

答案 1 :(得分:0)

这个插件的文档是一个笑话。解决方法是在创建客户端jar后创建内容,如下所示:

<build>
    <plugins>
        <plugin>
            <!--
                Generates JAXWS classes for all of the WSDL files in $[project.base.dir}/src/wsdl.
            -->
            <groupId>org.jvnet.jax-ws-commons</groupId>
            <artifactId>jaxws-maven-plugin</artifactId>
            <version>2.3</version>
            <executions>
                <execution>
                    <goals>
                        <goal>wsimport</goal>
                    </goals>
                    <configuration>
                        <args>
                            <arg>-clientjar</arg>
                            <arg>${project.build.directory}/wsimport-client.jar</arg>
                        </args>
                        <wsdlUrls>
                            <wsdlUrl>https://webservice.com/service.wsdl</wsdlUrl>
                        </wsdlUrls>
                    </configuration>
                </execution>
            </executions>
            <configuration>
                <target>2.1</target>
                <verbose>true</verbose>
            </configuration>
        </plugin>
        <plugin>
            <!--
                Unjar the wsimport-client.jar created in the jaxws-maven-plugin to the WAR's classes folder
            -->
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-antrun-plugin</artifactId>
            <version>1.7</version>
            <executions>
                <execution>
                    <phase>process-resources</phase>
                    <configuration>
                        <target>
                            <unzip src="${project.build.directory}/wsimport-client.jar" dest="${project.build.directory}/classes" />
                        </target>
                    </configuration>
                    <goals>
                        <goal>run</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

取自此处:https://gist.github.com/mpellegrini/5439304