使用Eclipse的ClassNotFoundException / NoClassDefFoundError

时间:2015-03-12 19:39:11

标签: java eclipse web-services ldap cxf

我正在使用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"/>

编译时没问题。知道为什么我在运行时得到这些异常吗?

1 个答案:

答案 0 :(得分:0)

在Eclipse中,当您通过Run As ... Java Application运行main()时,它使用的是与您运行的不同的JRE ...在服务器上运行。因此,只要编译和运行为Java应用程序,在项目的构建路径中指定外部JAR就是好的。在服务器上运行时,必须执行与指定服务器等效的操作(例如Tomcast)。糟糕的Eclipse并没有为你做到这一点。

至少有两种方法可以做到这一点:

  1. 从运行方式...运行配置,选择Tomcat并将所有外部JAR添加到Classpath选项卡中的用户条目,方法与项目的构建路径相同。

  2. 将所有外部JAR复制到您指定的已安装JRE的jre / lib / ext文件夹中。

  3. 我认为您也可以使用清单文件来查找所有外部jar文件,但我从未这样做过。另外,在Windows下偏好|服务器|运行时环境|默认的Classpath条目,您可以添加包含外部jar文件的整个文件夹。