NoClassDefFoundError - Eclipse - Apache HTTPClient 类未找到错误 - Eclipse - Apache HTTPClient

7
我正在尝试从Eclipse Juno(Jetty Web服务器)运行一个简单的基于REST的应用程序(稍后将部署在Google应用引擎上)。
以下是我的代码:
package co.suhas.live;

import java.io.IOException;
import javax.servlet.http.*;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

@SuppressWarnings("serial")
public class AppServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse resp)
        throws IOException {
    resp.setContentType("text/plain");
    resp.getWriter().println("Hello, world");

    HttpClient httpclient = new DefaultHttpClient();
    HttpGet httpget = new HttpGet(
            "http://www.google.com/search?q=google");

    HttpResponse response = httpclient.execute(httpget);

    resp.getWriter().println(response.toString());
    }
}

我已将Apache HTTP Client的jar文件添加到了构建路径中。
包括:
commons-codec-1.6.jar
commons-logging-1.1.1.jar
fluent-hc-4.2.3.jar
httpclient-4.2.3.jar
httpclient-cache-4.2.3.jar
httpcore-4.2.2.jar
httpmime-4.2.3.jar

但是当我在本地主机上运行它时,会出现这个错误:localhost
HTTP ERROR 500

Problem accessing /app. Reason:

org/apache/http/client/methods/HttpUriRequest

Caused by:

java.lang.NoClassDefFoundError: org/apache/http/client/methods/HttpUriRequest
at java.lang.Class.getDeclaredConstructors0(Native Method)
at java.lang.Class.privateGetDeclaredConstructors(Class.java:2404)
at java.lang.Class.getConstructor0(Class.java:2714)
at java.lang.Class.newInstance0(Class.java:343)
at java.lang.Class.newInstance(Class.java:325)
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.api.socket.dev.DevSocketFilter.doFilter(DevSocketFilter.java:74)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.tools.development.ResponseRewriterFilter.doFilter(ResponseRewriterFilter.java:123)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:34)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:61)
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:125)
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:94)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:383)
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.headerComplete(HttpConnection.java:923)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:547)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)
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)

我做错了什么?
9个回答

5

从Eclipse插件的角度来看,我遇到了同样的问题,并通过以下步骤解决:

  1. 将lib文件夹添加到根目录。
  2. 添加jar文件
  3. 打开MANIFEST.MF文件,转到运行时选项卡
  4. 将项目添加到类路径
  5. 进入构建选项卡
  6. 将文件添加到输出中

enter image description here

enter image description here


1
当我遇到这个问题时,结果发现当我将Fluent API作为Maven依赖项添加时,它导入了与我已经使用的HTTPClient API不同版本的API。两个API版本都打包在生成的JAR的lib文件夹中。版本冲突是导致此错误的原因。
将条目添加到类路径将解决问题,因为您只是手动指定要使用的版本。但是,为了解决潜在的问题,我只需要在重新构建之前删除目标文件夹(或运行maven clean)。这将删除任何“缓存”的库JAR,并在下一次构建时仅重新下载正确的库。
希望能对某人有所帮助!

1

由于这是一个在Web服务器上运行的项目,您需要将库部署到该服务器上。您可以尝试使用Eclipse Deployment Assembly来为您完成此操作。


我做了这个!我使用Eclipse的快速修复将其添加到服务器的PATH中。但仍然没有用。 - user2032663
将其添加到部署装配中的web-inf/lib目录中。 - sschrass
Eclipse自动将它添加到WEB-INF/lib中,使用快速修复。所以。:( - user2032663

1
我通过在Eclipse中删除此项目,删除工作区中的.metadata文件夹,并在重新启动Eclipse后再次导入项目来解决了这个问题。我不知道可能出了什么问题。

2
经典的Java。我在IntelliJ上遇到了类似的问题。代码出错了。我回滚到我知道能工作的版本。问题依旧。Java真是让人又爱又恨。 - Michael M

1

对于IntelliJ 12用户:

1)从“项目结构->库”中删除库。 enter image description here

2)从Maven存储库重新添加项目(在Project Structure中,单击“+”,然后选择“From Maven…”)。在下一个对话框中,键入“com.amazonaws:aws-java-sdk”,然后开始搜索。当搜索完成时,选择所需版本。enter image description here

3)按照通常的提示“修复”IJ12警报您的东西。您可能需要重新加载项目。

以上方法解决了我的问题。感谢@user2032663和@orberkov指出这是一个IDE问题。

注意!:我正在使用OpenDNS,IntelliJ12中的Maven客户端找不到任何libs>1.4.1,我切换到使用Google DNS(8.8.8.8和8.8.4.4),然后重试,然后它定位到我正在使用的版本1.5.8。


0

查看生成的war文件。您可以使用像7zip这样的zip浏览器来执行此操作。查看打包到war文件的/lib目录中的jar文件,并确保其中包含httpclient-4.2.3.jar。如果缺少它,您可以采纳SatelliteSD提出的建议。


刚刚完成了这个。httpclient-4.2.3.jar已经包含在/lib中。 - user2032663
2
也许Jetty没有像我期望的那样查看那个war文件。也许它正在执行“原地部署”以使事情更“容易”。我会把IDE排除在外,自己部署war文件。我曾经遇到过一些Jetty的问题,所以我建议您尝试另一个您熟悉的Web服务器,比如Tomcat或Glassfish。 - Thorn

0
如果你正在使用GWT,请小心,因为gwt-dev.jar包含多个Apache项目,所以你的程序可能会在开发中编译和运行,但由于gwt-dev.jar没有部署,你需要部署所需的jar包。

0

请检查您的项目中的.classpath文件与版本控制中的文件进行比较。当您通过IDE更改项目依赖项/类路径时,Eclipse很容易丢失与插件相关的部分。


0

这样会起作用:

正如错误信息所示(并且如上所述),您缺少 jar 包,更具体地说,您缺少一个http-client的 jar 包。

现在,您可以手动查找此 jar 包并将其添加到类路径/服务器的 lib 中,或者使用 jetty 的现有 jar 包;我更喜欢后者。

jetty.home中运行以下命令将显示 Jetty 服务器在运行时加载的所有 jar 包:

C:\jetty-distribution-9.4.0.v20161208>java -jar start.jar --list-classpath  

输出结果如下:

Jetty Server Classpath:
-----------------------
Version Information on 34 entries in the classpath.
Note: order presented here is how they would appear on the classpath.
      changes to the --module=name command line options will be reflected here.
 0:                    (dir) | ${jetty.base}\resources
 1:                    3.1.0 | ${jetty.base}\lib\servlet-api-3.1.jar
 etc...

您可以查看此列表,发现缺少http-client jar(例如jetty-client-9.4.0.v20161208.jar)。
Jetty可以加载此jar(它可以在其lib文件夹中找到),但需要明确提及它。
为此,请转到您的Jetty start.ini文件并添加相关模块:
module=client   

现在,再次检查已加载的jar列表 - jetty-client jar已经存在;

服务器现在将按需启动。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接