使用jaxws-maven-plugin控制JAX-WS wsdlLocation属性值(绝对路径)

我有一个JAX-WS驱动的Web服务,其WSDL我们从另一个Maven模块(我称之为ws-consumer )生成Web服务客户端。

无论好坏,我们将“已发布的WSDL”(服务在发布时保存/生成的WSDL和XSD的版本)复制到ws-consumer src/wsdl文件夹中,然后使用jaxws-maven-plugin org.jvnet使用jaxws:wsimport生成客户端jaxws:wsimport具有以下(截断)配置:

   org.jvnet.jax-ws-commons jaxws-maven-plugin 2.1     wsimport   src/main/resources/META-INF/wsdl/  MyWS/MyWS.wsdl      

现在,生成的客户端代码在类级别应用了以下注释:

 @WebServiceClient(name = "MyWS", targetNamespace = "http://myws/blah", wsdlLocation = "**file:/C:/some/absolute/path/src/main/resources/META-INF/wsdl/MyWS/MyWS.wsdl"**) 

强调我的

正如您所希望看到的那样, wsdlLocation属性值具有硬编码的绝对路径,在部署服务时该路径将不正确。

有没有什么办法可以通过将它设置为META-INF/wsdl/MyWS/MyWS.wsdl或其他一些值来“控制”它?

可以使用Codehaus插件:

  org.codehaus.mojo jaxws-maven-plugin 1.9    wsimport     true true ../wscontract/src/main/resources/wsdl wsdl/MaintainAddress.wsdl src/main/java .  jaxb/xsdbindings.xml jaxb/wsdlbindings.xml    

也许您使用的插件有类似的选项,或者您可以考虑切换。

您还可以显式配置WSDL,在这种情况下,将忽略此属性,但这可能不适合容器管理的应用程序。

示例代码在这里 。

将wsdlLocation与org.jvnet.jax-ws-commons中的jaxws-maven-plugin一起使用:

  org.jvnet.jax-ws-commons jaxws-maven-plugin 2.3    wsimport     src/main/resources/wsdl  arsdev.wsdl  wsdl/*  true jaxws.remedy.client.generated  target/generated-code/src   

我投了@dean-schulze的答案,因为它适用于org.jvnet.jax-ws-commons:jaxws-maven-plugin插件的情况。

使用CLI在本地显示帮助也可能很有趣,如下所示:

 mvn jaxws:help -Dgoal=wsimport -Ddetail 

如前面的答案中所述,我们可以使用wsdlLocation参数,如下所述:

 wsdlLocation @WebService.wsdlLocation and @WebServiceClient.wsdlLocation value. Can end with asterisk in which case relative path of the WSDL will be appended to the given wsdlLocation. Example: ...  src/mywsdls  a.wsdl b/b.wsdl ${basedir}/src/mywsdls/c.wsdl  http://example.com/mywebservices/*  ... wsdlLocation for a.wsdl will be http://example.com/mywebservices/a.wsdl wsdlLocation for b/b.wsdl will be http://example.com/mywebservices/b/b.wsdl wsdlLocation for ${basedir}/src/mywsdls/c.wsdl will be file://absolute/path/to/c.wsdl Note: External binding files cannot be used if asterisk notation is in place. 

-wsdllocation选项也记录在JDK的wsimport命令中:

  • JDK 7 – wsimport
  • JDK 8 – wsimport

但它只是说(参见@WebServiceClient javadoc ):

 Specifies the @WebServiceClient.wsdlLocation value. 

版本1.12无法识别 。 它抱怨说:

  No WSDLs are found to process, Specify atleast one of the following parameters: wsdlFiles, wsdlDirectory or wsdlUrls. 

版本1.9(如在您的示例中)只是忽略所有内容并且不生成任何代码。

一定有些变化。