Java 如何使用ApacheCXF作为客户端?

Java 如何使用ApacheCXF作为客户端?,java,web-services,jax-ws,cxf,Java,Web Services,Jax Ws,Cxf,我知道如何使用ApacheCXF生成客户端存根。但是,当我尝试运行生成的类时,它使用JAXWS。另外,我注意到生成的类的导入类来自javax包。如何将生成的类设置为使用apachecxf库而不是JAXWS库 下面是我用来生成客户端存根的代码: wsdl2java -frontend jaxws21 -wsdlLocation "META-INF/wsdl/WSCustom.wsdl" -client -d C:\Workspace\WSClient\META-INF\wsdl\ "C:\Work

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

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

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"

存根是正确的,其中不应该有任何特定于CXF的导入,因为CXF需要的所有信息都可以使用JAX-WS标准注释表示。在运行时,如果CXF客户端库位于类路径上,则将使用它们;如果CXF不可用,则将使用JDK中内置的RI客户端库。生成的存根将与其中一个一起使用

您在评论中询问,如果您只是在运行客户端,那么需要哪些CXF JAR?据我所知,这只是
CXF rt前端jaxws
CXF rt传输http
以及它们的可传递依赖项。如果您的项目是用maven构建的,那么只需声明这两个依赖项,其他所有内容都应该自动输入,如果不是,则下载并运行

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"

这将解决可传递的依赖关系,并将相关JAR从Maven Central下载到当前目录。

Hi,@Ian。谢谢你的回复。如果类路径上同时有CXF和内置JDK,那么优先考虑哪个?还有,有没有办法不把它放在类路径中,只把它放在应用程序的lib文件夹中?我如何检查它是否已经在使用CXF库?@Arci当我说“在类路径上”时,我的意思不一定是你必须设置一个环境变量,我只是说你的应用程序可以以任何需要的方式使用JAR(WEB-INF/lib,如果它是WEB应用程序,
java-cp
,对于命令行应用程序,无论什么)。它将使用最先找到的,如果你的类路径上同时有CXF和Metro jar,那么它将是最先列出的,如果你的应用程序中有CXF,并且你依赖rt.jar中的Metro内置副本,那么CXF应该会赢。在检查在给定时间使用的是哪一个方面,你可以启动(CXF文档,忽略顶部关于拦截器的部分,只有当您想记录发送和接收的原始soap消息时才这样做)。再次感谢您的解释!我现在明白了。我以为您指的是环境变量。@Arci我添加了一个技巧,您可以使用Ivy来解决可传递的依赖关系。