我正在使用Eclipse Kepler EE上的Tomcat 7使用CXF 2.7.14测试Web服务。传入请求调用Web服务;但是,在它进行任何处理之前,它会得到ClassNotFoundException:netscape.ldap.LDAPException(以及NoClassDefFoundError)。奇怪的是,如果我运行main()代替CXF调用,我就不会得到Exceptions。任何人有任何想法?
这是堆栈跟踪:
Mar 12, 2015 3:15:23 PM org.apache.cxf.phase.PhaseInterceptorChain doDefaultLogging
WARNING: Application {http://g.a.com}MyService#{http://g.a.com/myservice}getAddr has thrown exception, unwinding now
org.apache.cxf.interceptor.Fault: netscape/ldap/LDAPException
at org.apache.cxf.service.invoker.AbstractInvoker.createFault(AbstractInvoker.java:170)
at org.apache.cxf.jaxws.AbstractJAXWSMethodInvoker.createFault(AbstractJAXWSMethodInvoker.java:272)
at org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:136)
at org.apache.cxf.jaxws.AbstractJAXWSMethodInvoker.invoke(AbstractJAXWSMethodInvoker.java:237)
at org.apache.cxf.jaxws.JAXWSMethodInvoker.invoke(JAXWSMethodInvoker.java:69)
at org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:75)
at org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInvokerInterceptor.java:58)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:439)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at org.apache.cxf.workqueue.SynchronousExecutor.execute(SynchronousExecutor.java:37)
at org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor.java:107)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272)
at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)
at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:249)
at org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:248)
at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:222)
at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:153)
at org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:171)
at org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:286)
at org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:206)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:646)
at org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:262)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:314)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:662)
Caused by: java.lang.NoClassDefFoundError: netscape/ldap/LDAPException
at com.a.g.myservice.MyTypeImpl.getAddr(MyTypeImpl.java:50)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.cxf.service.invoker.AbstractInvoker.performInvocation(AbstractInvoker.java:188)
at org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:104)
... 37 more
Caused by: java.lang.ClassNotFoundException: netscape.ldap.LDAPException
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1720)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1571)
... 44 more
更新:我开始评论事情并最终找到了罪魁祸首,但我不知道原因:一旦我包含下面显示的“catch”语句,我就会得到例外。
import netscape.ldap.LDAPConnection;
import netscape.ldap.LDAPException;
...
try {
...
} catch (LDAPException le) {
...
如果我包含完整路径,则为netscape.ldap.LDAPException,同样为Exception。这个Netscape包是一个JAR文件的一部分,我在项目Build Path中添加了外部JAR,如下面的.classpath文件摘录所示:
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry exported="true" kind="lib" path="C:/Users/dh931w/g2src/jars/ldapjdk418.jar"/>
编译时没问题。知道为什么我在运行时得到这些异常吗?
答案 0 :(得分:0)
在Eclipse中,当您通过Run As ... Java Application运行main()时,它使用的是与您运行的不同的JRE ...在服务器上运行。因此,只要编译和运行为Java应用程序,在项目的构建路径中指定外部JAR就是好的。在服务器上运行时,必须执行与指定服务器等效的操作(例如Tomcast)。糟糕的Eclipse并没有为你做到这一点。
至少有两种方法可以做到这一点:
从运行方式...运行配置,选择Tomcat并将所有外部JAR添加到Classpath选项卡中的用户条目,方法与项目的构建路径相同。
将所有外部JAR复制到您指定的已安装JRE的jre / lib / ext文件夹中。
我认为您也可以使用清单文件来查找所有外部jar文件,但我从未这样做过。另外,在Windows下偏好|服务器|运行时环境|默认的Classpath条目,您可以添加包含外部jar文件的整个文件夹。