7

我正在尝试从 eclipse juno (jetty web-server) 运行一个简单的基于 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 客户端jar 文件添加到 BUILD PATH。

包含:

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)

我究竟做错了什么?

4

9 回答 9

5

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

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

在此处输入图像描述

在此处输入图像描述

于 2013-04-28T12:27:08.180 回答
1

由于它是在 Web 服务器上运行的项目,因此您需要将库部署在该服务器上。您可以尝试使用 eclipse 部署程序集为您执行此操作。

于 2013-02-14T13:07:28.353 回答
1

我通过从 eclipse 中删除这个项目来解决这个问题。重新启动eclipse后删除.metadata文件夹workspace并再次导入项目。我不知道可能是什么问题。

于 2013-02-16T06:44:00.050 回答
1

对于 Intelli-J 12 用户:

1) 从项目结构->库中删除库。在此处输入图像描述

2) 从 Maven 存储库重新添加项目(在项目结构中,单击“+”并选择“From Maven...”)。在接下来出现的对话框中,输入“com.amazonaws:aws-java-sdk”并开始搜索。搜索完成后,选择所需的版本在此处输入图像描述

3) 按照通常的提示“修复”IJ12 提醒您的损坏的东西。系统可能会提示您重新加载项目。

那为我修好了。感谢@user2032663 和@orberkov 指出这是一个IDE 问题。

笔记 !!!:我正在使用 OpenDNS,而 IntelliJ12 中的 Maven 客户端找不到任何 > 1.4.1 的库,我切换到使用 Google DNS(8.8.8.8 和 8.8.4.4)并重试,然后它找到了我正在使用的版本1.5.8。

于 2013-09-25T03:20:13.583 回答
1

当我遇到这个问题时,事实证明,当我将 Fluent API 添加为 Maven 依赖项时,它导入的 HTTPClient API 版本与我已经使用的版本不同。两个版本的 API 都打包在生成的 JAR 的 lib 文件夹中。版本冲突是导致此错误的原因。

将条目添加到您的类路径将解决问题,因为您只是手动指定要使用的版本。但是,为了解决根本问题,我只需要在重建之前删除我的目标文件夹(或运行 maven clean)。这删除了所有“缓存”的库 JAR,并且在下一次构建时,只重新下载了正确的 JAR。

希望对某人有所帮助!

于 2014-11-10T20:36:48.747 回答
0

查看生成的战争文件。您可以使用 7zip 之类的 zip 浏览器来执行此操作。查看哪些 jar 文件被打包到 war 文件的 /lib 中,并确保httpclient-4.2.3.jar包含在内。如果它丢失了,你可以接受我的 SatelliteSD 的建议。

于 2013-02-14T13:20:40.430 回答
0

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

于 2013-05-19T16:37:27.287 回答
0

对照版本控制中的文件检查项目的 .classpath 文件。当您通过 IDE 更改项目依赖项/类路径时,Eclipse 擅长丢失与插件有关的位。

于 2015-10-13T06:45:58.907 回答
0

这将起作用:

正如您在错误中看到的(如上所述),您缺少 jar/s - 更具体地说 - 您缺少一个http-client jar。

现在您可以选择手动查找此 jar 并将其添加到您的类路径/服务器的库中,或者使用码头现有的 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 在那里;

服务器现在将根据需要启动。

于 2016-12-28T13:51:37.783 回答