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,并在下一个版本中,只重新下载了正确的库。
希望能帮到别人!