【发布时间】:2015-02-11 19:32:13
【问题描述】:
我们在live环境中的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 上的一些帖子:
Catching webservice exception with CXF: NoClassDefFoundError: SOAPFaultBuilder
Could not initialize class 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。
【问题讨论】:
-
在这篇文章之后我学到的一件事是
java.lang.ClassNotFoundException和java.lang.NoClassDefFoundError之间的区别。在这种情况下,问题可能是因为SOAPFaultBuilder由于其他原因未能初始化。不幸的是,我在我们的生产日志中没有发现其他异常。现在,我将尝试通过添加jaxws-api.jar、jaxws-rt.jar、jaxws-tools.jar和saaj-impl.jar到其他帖子建议的类路径来解决问题。 -
我正在使用带有 RS-libs 的 TomEE ...但也遇到了这个问题 ...@xli 自从您从事此工作以来,您有任何进展吗?
-
@FibreFoX 不多。您可以尝试添加这些 JAR 以查看是否有帮助。我最终删除了这些 JAR,因为它们在我们的系统中引起了一些依赖问题。
标签: java web-services soap jar soapfault