-clientjar恕我直言,该选项的记录确实很少。我认为这是有效的:
使用该
-clientjar <jarfile>选项时,发生了 三 件事:
- 您将
<jarfile>
在-d
该wsimport
工具的参数所指向的目录中生成一个。其中将包含WSDL和任何相关的XSD文件。这个小捆绑包根本不会用于任何东西。如果您想使用它,完全取决于您。但是在您看到下面的(2)之前。我不知道除了将其作为文档形式外,还可以将该jarfile用作什么。 - 您将获得WSDL的副本,该副本放入名为的文件中
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");



