Вопрос по httpclient, classnotfound, classpath, java – HttpClient NoClassDefFoundError

13

Я пытаюсь запустить пример приложения из 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

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

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

Если вы запускаете его как файл JARjava.exe -jar или дважды щелкнув файл, вам нужно указать путь к классам вClass-Path вход в банки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

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

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

Используя Textpad. Он находится в том же каталоге, что и файлы JAR, и у меня это есть в конфигурации $ File -cp.; 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 Компилируется нормально, но не запускается. user389753
2

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

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

... а потом все заработало без ошибок

0

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

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

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

Похожие вопросы