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文件? 预先感谢您的帮助。

此exception表示运行时类路径中缺少所提到的类。

有几种方法可以指定运行时类路径,具体取决于您执行程序的方式。 由于一个体面的IDE从你手中透明地接受了这一切,我打赌你在命令提示符下运行它。

如果您通过java.exe -jar将其作为JAR文件运行或双击该文件,则需要在JAR的MANIFEST.MF文件的Class-Path条目中指定Class-Path 。 请注意,每当执行JAR时,都会忽略 %CLASSPATH%环境变量和-cp-classpath参数。

如果您通过java.exe将其作为“普通的”Java应用程序运行,则需要在-cp-classpath参数中指定它。 请注意,无论何时使用此参数,都会忽略 %CLASSPATH%环境变量。

无论哪种方式,类路径都应该存在一个(半)冒号分隔的JAR文件路径(绝对路径或相对于当前工作目录)。 例如

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

(如果您使用的是Unix / Linux,请使用冒号而不是分号作为路径分隔符)

该类在httpclient-4.0.1.jar中(我刚刚下载它以确定)所以我怀疑你没有正确地将它放在类路径中。

你是如何编译和运行代码的?

在cloudera-quickstart-vm-5.8.0中运行Eclipse Luna 2(4.4.2)我不得不添加以下内容

  • Apache的httpcomponents-httpcore.jar
  • HttpClient的-4.5.3.jar
  • HttpClient的缓存-4.5.3.jar

……然后它没有错误地工作

当我遇到这个问题时,结果发现当我将Fluent API添加为Maven依赖项时,它导入的HTTPClient API版本与我已经使用的版本不同。 这两个版本的API都打包在生成的JAR的lib文件夹中。 版本冲突是导致此错误的原因。

向类路径添加条目将解决问题,因为您只需手动指定要使用的版本。 但是,要修复底层问题,我只需要在重建之前删除我的目标文件夹(或运行maven clean)。 这删除了任何“缓存”库JAR,并在下一个版本中,只重新下载了正确的库。

希望能帮到别人!