NoClassDefFoundError-Eclipse - Apache HTTPClient

Я пытаюсь запустить простое приложение на основе REST от eclipse juno (jetty web-server) (будет развернут позже в Google app engine)

вот мой код:

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 ответов


с точки зрения плагина Eclipse. Я столкнулся с той же проблемой и решил ее следующим образом:

  1. Добавить папку lib в корень.
  2. добавить файлы jar
  3. откройте манифест.MF-файл, перейдите на вкладку Runtime
  4. добавить элементы в classpath
  5. перейдите на вкладку строить
  6. добавить файлы к выходу

enter image description here

enter image description here


поскольку это проект, который работает на веб-сервере, вам нужно, чтобы ваши библиотеки были развернуты на этом сервере. Вы можете попробовать сборку развертывания eclipse, чтобы сделать это за вас.


я исправил это, удалив этот проект из eclipse. Удаление на workspace и импорт проекта обратно после перезапуска eclipse. Я не знаю, в чем могла быть проблема.


когда я столкнулся с этой проблемой, оказалось, что когда я добавил Fluent API в качестве зависимости Maven, он импортировал другую версию API HTTPClient, чем тот, который я уже использовал. Обе версии API были упакованы в полученную папку lib JAR. Конфликт версий является причиной этой ошибки.

добавление записей в путь к классам устранит проблему, потому что вы просто вручную указываете, какую версию использовать. Однако, чтобы устранить основную проблему, я просто необходимо удалить мою целевую папку перед восстановлением (или запустить Maven clean). Это удалило все "кэшированные" библиотечные банки, а при следующей сборке только повторно загрузило правильный.

надеюсь, что кто-то поможет!


Для Пользователей Intelli-J 12:

1) Удалите библиотеку из структуры проекта - >Библиотеки.enter image description here

2) Повторно добавьте проект из репозиториев Maven (где вы находитесь в структуре проекта, нажмите "+" и выберите "из Maven..."). В следующем диалоговом окне введите " com.amazonaws: aws-java-sdk " и начать поиск. Когда поиск будет завершен, выберите нужную версию enter image description here

3) следуйте обычным подсказкам, чтобы "исправить" сломанные вещи, которые предупреждает ij12 ты около. Вам может быть предложено перезагрузить проект.

это исправило это для меня. Спасибо @user2032663 и @orberkov за указание на то, что это проблема IDE.

внимание !!! : Я использую OpenDNS, и клиент Maven в IntelliJ12 не смог найти никаких libs > 1.4.1, я переключился на использование Google DNS (8.8.8.8 и 8.8.4.4) и повторил, затем он нашел версию, которую я использую, которая является 1.5.8.


посмотрите внутри сгенерированного файла war. Вы можете сделать это с помощью zip explorer, как 7zip. Посмотрите, какие файлы jar упакованы в / lib файла war и убедитесь, что httpclient-4.2.3.jar включен. Если он отсутствует, вы можете принять предложение, сделанное моим SatelliteSD.


Если вы используете GWT, будьте осторожны, потому что gwt-dev.jar содержит несколько проектов apache, поэтому ваша программа может компилироваться и запускаться в разработке, но начиная с gwt-dev.jar не развернут, вам нужно развернуть необходимые банки.


проверяем .файл classpath вашего проекта против одного в контроль версий. Eclipse хорошо теряет биты, относящиеся к плагинам, когда вы вносите изменения в зависимости проекта / Путь к классам через IDE.


Это будет работать:

как вы можете видеть в ошибке (и, как упоминалось выше), вам не хватает jar/s - и более конкретно - вам не хватает http-клиент jar.

Теперь вы выбираете либо найти эту банку вручную и добавить ее в lib вашего classpath/server, либо использовать существующую банку jetty; я предпочитаю последнюю.

выполнение следующей команды в пристань.домой отобразит все банки, загруженные во время выполнения сервер Jetty:

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...

вы можете проверить этот список и обнаружить, что в нем отсутствует jar http-клиента (например, причал-клиент-9.4.0.v20161208.Джар)

Jetty может загрузить эту банку (ее можно найти в папке lib), но она требует явно упомянуть об этом.

чтобы сделать это, перейдите на свой причал начать.ini файл и добавьте соответствующий модуль:

module=client   

сейчас, проверить снова список загруженных банок-банка jetty-client есть;

сервер теперь запустится по мере необходимости.