2012-03-12 92 views
31

我试图从GWT servlet中获取从Web服务获取JSON响应的请求。 以下是在我的servlet代码:java.lang.NoClassDefFoundError:org/apache/http/client/HttpClient

public String getQueData() throws IllegalArgumentException { 
    String message = null; 
    try {   
     HttpClient httpclient = new DefaultHttpClient(); 
     JSONParser parser = new JSONParser(); 

     String url = "working - url"; 
     HttpResponse response = null; 
     response = httpclient.execute(new HttpGet(url)); 

     JSONObject json_data = null; 
     json_data = (JSONObject)parser.parse(EntityUtils.toString(response.getEntity())); 
     JSONArray results = (JSONArray)json_data.get("result"); 
     for (Object queid : results) { 
      message = message.concat((String) ((JSONObject)queid).get("id")); 
      message = message.concat("\t"); 
      message = message.concat((String) ((JSONObject)queid).get("owner")); 
      message = message.concat("\n"); 
     } 
     } catch (Exception e) { 
    message = e.toString(); 
    } 
    return message; 
} 

收到以下异常在试图使从GWT servlet的GET请求。

java.lang.NoClassDefFoundError: org/apache/http/client/HttpClient 
    at java.lang.Class.getDeclaredConstructors0(Native Method) 
    at java.lang.Class.privateGetDeclaredConstructors(Class.java:2389) 
    at java.lang.Class.getConstructor0(Class.java:2699) 
    at java.lang.Class.newInstance0(Class.java:326) 
    at java.lang.Class.newInstance(Class.java:308) 
    at org.mortbay.jetty.servlet.Holder.newInstance(Holder.java:153) 
    at org.mortbay.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:428) 
    at org.mortbay.jetty.servlet.ServletHolder.getServlet(ServletHolder.java:339) 
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166) 
    at com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:35) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:60) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:122) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at com.google.appengine.tools.development.BackendServersFilter.doFilter(BackendServersFilter.java:97) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388) 
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) 
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) 
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) 
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418) 
    at com.google.appengine.tools.development.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:78) 
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
    at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:362) 
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
    at org.mortbay.jetty.Server.handle(Server.java:326) 
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542) 
    at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:938) 
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:755) 
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218) 
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) 
    at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409) 
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582) 
Caused by: java.lang.ClassNotFoundException: org.apache.http.client.HttpClient 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306) 
    at com.google.appengine.tools.development.IsolatedAppClassLoader.loadClass(IsolatedAppClassLoader.java:176) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247) 

什么可能是这种例外的原因? 它如何被删除?

我在ubuntu 10.04上使用jdk1.6.0_30。

回答

23

What could be the possible cause of this exception?

您的班级路径中可能没有适当的Jar。

How it could be removed?

通过将HTTPClient jar放入您的类路径中。如果它是一个Web应用程序,复制罐到WEB-INF/lib如果它是独立的,请确保您有这个jar在类路径或使用-cp选项

doc说明确设置,

Thrown if the Java Virtual Machine or a ClassLoader instance tries to load in the definition of a class (as part of a normal method call or as part of creating a new instance using the new expression) and no definition of the class could be found.

The searched-for class definition existed when the currently executing class was compiled, but the definition can no longer be found.

+0

感谢您的这一点,但现在我得到这个错误com.google.gwt.user.server.rpc.UnexpectedException – 2012-03-12 08:51:30

+0

我不确定新的异常,我知道什么原因导致NoClassDefFound的一些东西,我与他分享您。 – Nishant 2012-03-12 08:54:11

+0

感谢您的回复 – 2012-03-12 08:54:55

42

如果它是一个Maven项目,添加在您的POM文件

<dependency> 
     <groupId>org.apache.httpcomponents</groupId> 
     <artifactId>httpclient</artifactId> 
     <version>4.3.4</version> 
    </dependency> 
+3

对于Gradle:'编组:'org.apache.httpcomponents',名称:'httpclient',版本:'4.5.2'' – gudthing 2016-05-26 19:41:09

1

我解决了这个问题,我自己下面的依赖,我发现还有的是不同版本的其他依赖JAR文件的HTTP客户端的两个文件。因此,有可能是版本库之间崩溃文件所以从这个zip文件的lib文件夹中删除所有旧的/以前的库文件,然后重新添加的jar文件:

Donwload Zip file from here

+0

没有为我工作..没有任何下载的好处。 – Madhab452 2017-04-20 05:48:55

2

我面临同样的问题。在我的情况下,我有一个httpclient与旧版本的依赖关系,而sendgrid则需要更新版本的httpclient。只要确保你的依赖关系中的httpclient版本是正确的,它就可以正常工作。

+1

拯救生命..将httpclient从4.3.5更改为4.5.3。工作得很好 – user3014595 2017-10-13 07:19:02

1

如果存在不同的jar版本,则会出现此问题。特别是httpcore和httpclient的版本。使用相同版本的httpcore和httpclient。