【问题标题】:How to use Apache CXF as client?如何使用 Apache CXF 作为客户端?
【发布时间】:2013-02-18 06:45:24
【问题描述】:

我知道如何使用 Apache CXF 生成客户端存根。但是,当我尝试运行生成的类时,它使用 JAXWS。另外,我注意到生成的类的导入类来自 javax 包。如何设置生成的类以使用 Apache CXF 库而不是 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"

【问题讨论】:

    标签: java web-services jax-ws cxf


    【解决方案1】:

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

    您在 cmets 中询问如果您只是在运行客户端,则需要哪些 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"
    

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

    【讨论】:

    • 嗨,@Ian。感谢您的回复。如果 CXF 和内置 JDK 在类路径上都可用,那么优先级是哪一个?另外,有没有办法不把它放在类路径中,只将它包含在应用程序的 lib 文件夹中?如果它已经在使用 CXF 库,我该如何检查?
    • @Arci 当我说“在类路径上”时,我并不一定意味着你必须设置一个环境变量,我只是意味着你的应用程序可以以任何需要的方式使用 jars(WEB- INF/lib 如果它是一个 Web 应用程序,java -cp 是一个命令行应用程序,无论如何)。它将使用首先找到的那个 - 如果您在“类路径”上同时拥有 CXF 和 Metro jar,那么它将是首先列出的那个,如果 CXF 在您的应用程序中并且您依赖于内置副本rt.jar 中的 Metro 然后 CXF 应该获胜。
    • 在检查给定时间正在使用的内容方面,您可以调高 logging level(CXF 文档,忽略顶部关于拦截器的部分,仅当您想记录原始发送和接收的肥皂消息)。
    • 再次感谢您的解释!我现在明白了。我以为你指的是环境变量。
    • @Arci 我添加了一个技巧,您可以使用 Ivy 来解决传递依赖关系。
    猜你喜欢
    • 2015-01-03
    • 1970-01-01
    • 1970-01-01
    • 2014-12-12
    • 2017-06-13
    • 1970-01-01
    • 1970-01-01
    • 2017-02-18
    • 1970-01-01
    相关资源
    最近更新 更多