HttpClient NoClassDefFoundError - PullRequest
       16

HttpClient NoClassDefFoundError

13 голосов
/ 12 июля 2010

Я пытаюсь запустить пример приложения из HttpClient 4.0.1.Это файл ClientMultiThreadedExecution.java из раздела примеров.Я помещаю эти файлы в classpath: 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 включить?Заранее благодарю за помощь.

Ответы [ 4 ]

5 голосов
/ 12 июля 2010

Это исключение говорит о том, что упомянутый класс отсутствует в runtime classpath.

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

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

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

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

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

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

5 голосов
/ 12 июля 2010

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

2 голосов
/ 27 февраля 2017

Запуск 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

... и тогда все заработало без ошибок

0 голосов
/ 10 ноября 2014

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

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

Надеюсь, это кому-нибудь поможет!

...