我正在使用jaxws-maven-plugin为Web服务使用者应用程序执行wsimport。我正在使用-clientjar
wsimport的选项,该选项是2010年随JAX-WS 2.2.2 RI引入的。之所以这样做,是因为我想将WSDL捆绑在jar中。
我在制作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中。
基本问题是如何-clientjar
在Maven项目中正确使用wsimport选项?
Java 1.7.0_45。
-clientjar
恕我直言,该选项的确记录不充分。我认为这是有效的:
使用该-clientjar <jarfile>
选项时,发生了三件事:
<jarfile>
在-d
该wsimport
工具的参数所指向的目录中生成一个。其中将包含WSDL和任何相关的XSD文件。这个小捆绑包根本不会用于任何东西。如果您想利用它,完全取决于您。但是在您看到下面的(2)之前。我不知道除了将其作为文档形式外,还可以使用此jarfile来做什么。META-INF/wsdl/<svcname>.wsdl
。生成的类将在no-arg代理构造函数中使用此文件。因此,如果您使用该-clientjar
选项请求捆绑的WSDL文件,则将实际使用该文件。wsdlLocation
,如果您在类上使用默认的no-arg构造函数@WebServiceClient
,则将是捆绑的WSDL(来自(2))的代码,而不是远程WSDL的代码。的确,如果您-wsdllocation
在命令行上与一起使用,-clientjar
则您指定的任何内容都-wsdllocation
将无效,因为-clientjar
它将具有优先权。因此,我们必须关注(2)和(3),因为这是实际使用的唯一代码...至少如果您原样使用生成的代码。
有趣的是,(2)的结果只是一个WSDL文件。该文件可能具有指向XSD文件的嵌入式链接,但据我所知,永远不会遵循该链接。原因是,当我们说Web服务使用者在运行时需要WSDL时,实际上只需要WSDL本身,而不需要模式。模式已“硬编码”到使用者中,无法在运行时进行更改。因此,没有理由在运行时读取架构信息。(这是我的理解)
关于(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");
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句