我正在使用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。
答案 0 :(得分:4)
-clientjar
选项的记录很少,恕我直言。
以下是我相信它的工作原理:
使用-clientjar <jarfile>
选项时发生了三次事件:
<jarfile>
-d
工具的wsimport
参数。这将包含在内
它既包括WSDL,也包括任何相关的XSD文件。这个小包不会用于任何东西。如果你想使用它,那完全取决于你。但在你看到下面的(2)之前。除了作为一种文档形式之外,我不确定该jar文件的用途。META-INF/wsdl/<svcname>.wsdl
。生成的类将使用它
no-arg代理构造函数中的文件。所以这就是实际的
如果您使用-clientjar
请求捆绑的WSDL文件,则使用
选项。 wsdlLocation
,如果您在@WebServiceClient
类上使用默认的无参数构造函数,将是捆绑的WSDL(来自(2)),而不是比远程WSDL。实际上,如果您在命令行中使用-wsdllocation
和-clientjar
,那么您使用-wsdllocation
指定的任何内容都将无效,因为-clientjar
优先。所以我们必须关注(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>