使用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(如在您的示例中)只是忽略所有内容并且不生成任何代码。
一定有些变化。