JAX-WS = 当 Apache CXF 安装时,它会“窃取”默认的 JDK JAX-WS 实现,如何解决?

2022-09-01 05:36:17

我有一个奇怪的问题。

  1. 使用wsimport,我从WSDL(在专用的eclipse java项目中)生成了als JAX-WS代码。这在JDK6中工作正常,没有任何外部依赖关系(在Eclipse中运行)

  2. 我有第二个项目,我曾经使用过Apache CXF。如果我复制 1.) 中描述的代码。进入这个项目,突然不是JDK执行JAX-WS的东西(我生成的文件),而是Apache CXF。

如何防止 Apache CXF “运行”JAX-WS 的东西。(问题是,CXF 无法运行代码...)。我也完全不明白Apache CXF是如何发现这些类的。我没有注册他们吗?

谢谢!马库斯


答案 1

Apache CXF(确切地说)在JVM中将自己注册为JAX-WS提供程序。在前面提到的 JAR 中,有一个名为: 的文件,其中包含以下内容:cxf-rt-frontend-jaxws-*.jar/META-INF/services/javax.xml.ws.spi.Provider

org.apache.cxf.jaxws.spi.ProviderImpl

如果您现在查看方法,您会发现 JDK 在 CLASSPATH 中搜索文件是否存在,如果不可用,则回退到默认的 Sun 实现。因此,您有两种选择来强制回退:javax.xml.ws.spi.FactoryFinder#findjavax.xml.ws.spi.Provider

  • 从类路径中删除cxf-rt-frontend-jaxws-*.jar

  • 或覆盖 CXF 提供的文件以指向回退位置javax.xml.ws.spi.Provider

第二种选择实际上更容易一些。只需创建:

/src/main/resources/META-INF/services/javax.xml.ws.spi.Provider

文件(假设您使用的是 Maven),其中包含以下内容:

org.apache.cxf.jaxws.spi.ProviderImpl

就是这样,用.javax.xml.ws.Endpoint#publish


答案 2

对于默认实现,放置:

com.sun.xml.internal.ws.spi.ProviderImpl

inside /src/main/resources/META-INF/services/javax.xml.ws.spi.Provider


推荐