2013-03-04 106 views
5

我知道如何使用Apache CXF生成客户端存根。但是,当我尝试运行生成的类时,它使用JAXWS。另外,我注意到生成的类的导入类来自javax包。我如何使用设置生成的类来使用Apache CXF库而不是JAXWS库?如何使用Apache CXF作为客户端?

下面是我用它来生成客户端存根代码:

wsdl2java -frontend jaxws21 -wsdlLocation "META-INF/wsdl/WSCustom.wsdl" -client -d C:\Workspace\WSClient\META-INF\wsdl\ "C:\Workspace\WSClient\META-INF\wsdl\WSCustom.wsdl" 

回答

4

存根是正确的,不应该有任何具体的CXF-进口他们,因为所有的信息CXF需要可以使用代表JAX-WS标准注释。在运行时,CXF客户端库将在类路径上使用,或者如果CXF不可用,则将使用内置于JDK中的RI客户端库。生成的存根将与两者兼而有之。

如果您只是运行客户端,您在评论中询问需要哪些CXF JAR - 据我所知,它只是cxf-rt-frontend-jaxwscxf-rt-transports-http加上它们的传递依赖关系。如果你的项目使用Maven构建那么就声明这两个依赖和其他一切应该会自动进来,如果没有则下载Apache Ivy main JAR,然后运行

java -jar ivy-2.3.0.jar -dependency org.apache.cxf cxf-rt-frontend-jaxws 2.7.3 -retrieve "[artifact]-[revision](-[classifier]).jar" 
java -jar ivy-2.3.0.jar -dependency org.apache.cxf cxf-rt-transports-http 2.7.3 -retrieve "[artifact]-[revision](-[classifier]).jar" 

这应该解决的传递依赖并从中下载的Maven相关的JAR集中到当前目录中。

+0

嗨,@Ian。感谢您的回复。如果CXF和内置的JDK在类路径中都可用,哪个会成为优先级?另外,有没有办法不把它放在类路径中,只将它包含在应用程序的lib文件夹中?我如何检查它是否已经在使用CXF库? – Arci 2013-03-04 08:40:25

+1

@Arci当我说“在类路径上”时,我并不一定意味着你必须设置一个环境变量,我只是说这些jar可以以任何需要的方式提供给你的应用程序(WEB-INF/lib,如果它是一个web应用程序,命令行应用程序的'java -cp',无论如何)。它将首先使用找到的任何一个 - 如果CXF和Metro Jars都位于类路径中,那么它将首先列出,如果CXF在您的应用程序中,并且您依赖于内置的副本在rt.jar的地铁,然后CXF应该赢。 – 2013-03-04 08:51:11

+1

在检查某个特定时间正在使用的方面,您可以调整[logging level](http://cxf.apache.org/docs/debugging-and-logging.html#DebuggingandLogging-Configurelogginglevels。​​)(CXF docs,忽略顶部关于拦截器的位,只有当你想记录发送和接收的原始肥皂信息时)。 – 2013-03-04 08:56:59