我们在现场环境中的 Web 服务客户端最近遇到了异常:
java.lang.NoClassDefFoundError: Could not initialize class com.sun.xml.internal.ws.fault.SOAPFaultBuilder
at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:107)
at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:78)
at com.sun.xml.internal.ws.client.sei.SEIStub.invoke(SEIStub.java:135)
at com.sun.proxy.$Proxy146.search(Unknown Source)
....
我在网上做了很多搜索,包括 StackOverflow 上的一些帖子:
使用 CXF 捕获 Web 服务异常:NoClassDefFoundError: SOAPFaultBuilder
无法初始化类 com.sun.xml.internal.ws.fault.SOAPFaultBuilder
java.lang.NoClassDefFoundError:无法初始化类 com.sun.xml.internal.ws.fault.SOAPFaultBuilder
我的理解是我们的客户端从服务器收到了一个 SOAP 错误,它缺少一些 jar 文件。所以我试图通过首先重新创建它来解决这个问题。
我在 Eclipse 中创建了一个简单的 Web 服务服务器项目,它有一个 Web 方法会抛出一个由@WebFault
. 然后我创建了一个使用 Web 方法的简单 Web 服务客户端项目。客户端项目的类路径中没有任何额外的库/jar;它只有 JRE。令我惊讶的是,它没有抛出 NoClassDefFoundError 异常!相反,我得到了javax.xml.ws.soap.SOAPFaultException
我在服务器端定义的。
该类SOAPFaultBuilder
确实在 JRE 的 rt.jar 中。因此,我创建的简单 Web 服务项目可能只是按其应有的方式工作。但是,我们live环境中的web服务客户端怎么会抛出NoClassDefFoundError
异常呢?该项目的类路径中肯定有 rt.jar。
谁能解释一下这个问题?如果它缺少一些 jar 文件(来自 jaxws RI 或 Apache CXF 或其他),为什么我创建的超级简单客户端没有抛出错误?直播环境和我的本地环境都使用Java7u51。