web-dev-qa-db-ja.com

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)

参照がありませんか?クラスパスエラーのようですが、どのjarファイルを含めるかわかりませんか?よろしくお願いします。

13
user389753

この例外は、言及されたクラスがruntimeクラスパスにないことを示しています。

プログラムの実行方法に応じて、ランタイムクラスパスを指定する方法はいくつかあります。まともなIDEはこれをすべて手から透過的に取るので、コマンドプロンプトで実行していると思います。

Java.exe -jarでJARファイルとして実行するか、ファイルをダブルクリックする場合は、JARのClass-PathファイルのMANIFEST.MFエントリでクラスパスを指定する必要があります。 JARを実行するときは常に、%CLASSPATH%環境変数と-cpおよび-classpath引数はignoredであることに注意してください。

「プレーンバニラ」として実行している場合Java by Java.exeのアプリケーションの場合、-cpまたは-classpath引数で指定する必要があります。 。この引数を使用するときは常に、%CLASSPATH%環境変数はignoredであることに注意してください。

どちらの方法でも、クラスパスはJARファイルへのパスの(セミ)コロンで区切られた文字列(絶対パスまたは現在の作業ディレクトリに対する相対パス)で存在する必要があります。例えば。

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

(Unix/Linuxを使用している場合は、パスの区切り文字としてセミコロンの代わりにコロンを使用してください)

5
BalusC

そのクラスはhttpclient-4.0.1.jarにあります(確かにダウンロードしました)ので、クラスパスに適切に配置していないと思います。

コードをどのようにコンパイルして実行しますか?

5
Jon Skeet

Cloudera-quickstart-vm-5.8.0内でEclipse Luna 2(4.4.2)を実行する場合、以下を追加する必要がありました。

  • Apache-httpcomponents-httpcore.jar
  • httpclient-4.5.3.jar
  • httpclient-cache-4.5.3.jar

...そして、それはエラーなしで機能しました

2
George Fisher

この問題が発生したとき、Fluent APIをMaven依存関係として追加すると、すでに使用しているものとは異なるバージョンのHTTPClient APIがインポートされることがわかりました。 APIの両方のバージョンは、結果のJARのlibフォルダーにパッケージ化されていました。バージョンの競合がこのエラーの原因です。

使用するバージョンを手動で指定するだけなので、クラスパスにエントリを追加すると問題が解決します。ただし、根本的な問題を修正するために、再構築(またはmaven cleanを実行)する前にターゲットフォルダーを削除する必要がありました。これにより、「キャッシュされた」ライブラリJARが削除され、次のビルドでは、正しいものだけが再ダウンロードされました。

それが誰かを助けることを願っています!

0
Jacob Ensor