Подтвердить что ты не робот

HttpClient NoClassDefFoundError

Я пытаюсь запустить пример приложения из HttpClient 4.0.1. Это файл ClientMultiThreadedExecution.java из раздела примеров. Я помещал эти файлы в путь к классам: apache-mime4j-0.6.jar; commons-codec-1.3.jar; commons-logging-1.1.1.jar; httpclient-4.0.1.jar; httpcore-4.0.1.jar; httpmime-4.0.1.jar и файл компилируется правильно. Во время выполнения я получаю следующую ошибку:

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/http/client/methods/HttpUriRequest
Caused by: java.lang.ClassNotFoundException: org.apache.http.client.methods.HttpUriRequest
    at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)

Мне не хватает ссылки? Это похоже на ошибку classpath, но я не могу понять, какой файл jar включить? Заранее благодарю вас за помощь.

4b9b3361

Ответ 1

Это исключение указывает, что указанный класс отсутствует в пути runtime.

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

Если вы используете его как файл JAR с помощью java.exe -jar или дважды щелкнув файл, вам нужно указать путь к классу в записи Class-Path файла JAR MANIFEST.MF. Обратите внимание, что переменные окружения %CLASSPATH% и -cp и -classpath аргументы игнорируются при каждом запуске JAR.

Если вы используете его как приложение "plain vanilla" Java на java.exe, вам нужно указать его в аргументе -cp или -classpath. Обратите внимание, что всякий раз, когда вы используете этот аргумент, переменная среды %CLASSPATH% игнорируется.

В любом случае путь к классам должен существовать (полу) colconnparated string путей к JAR файлам (либо абсолютным путям, либо относительным к текущему рабочему каталогу). Например.

java -cp .;/path/to/file1.jar;/path/to/file2.jar com.example.MyClass

(если вы используете Unix/Linux, используйте двоеточие вместо точки с запятой в качестве разделителя путей)

Ответ 2

Этот класс находится в httpclient-4.0.1.jar(я только что скачал его, чтобы убедиться), поэтому я подозреваю, что вы не поместили его в путь к классам.

Как вы компилируете и запускаете свой код?

Ответ 3

Запуск Eclipse Luna 2 (4.4.2) внутри cloudera-quickstart-vm-5.8.0 Мне пришлось добавить следующие

  • апач-httpcomponents-httpcore.jar
  • HttpClient-4.5.3.jar
  • HttpClient-кэш-4.5.3.jar

... и затем он работал без ошибок

Ответ 4

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

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

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

Ответ 5

С maven это можно сделать с помощью области импорта.