我正在尝试从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文件?提前感谢您的帮助。
答案 0 :(得分:5)
该类位于httpclient-4.0.1.jar中(我刚刚下载它以确定)所以我怀疑你没有把它放在类路径中。
您如何编译和运行代码?
答案 1 :(得分:5)
此异常表示运行时类路径中缺少所提到的类。
有多种方法可以指定运行时类路径,具体取决于您执行程序的方式。由于一个体面的IDE从你的手中透明地接受这一切,我打赌你在命令提示符下运行它。
如果您通过java.exe -jar
将其作为JAR文件运行或双击该文件,则需要在JAR的Class-Path
文件的MANIFEST.MF
条目中指定类路径。请注意,每当您执行JAR时,%CLASSPATH%
环境变量以及-cp
和-classpath
参数都会被忽略。
如果您在java.exe
之前将其作为“普通的”Java应用程序运行,则需要在-cp
或-classpath
参数中指定它。请注意,无论何时使用此参数,%CLASSPATH%
环境变量都会被忽略。
无论哪种方式,类路径都应该存在一个(半)冒号分隔的JAR文件路径(绝对路径或相对于当前工作目录)。 E.g。
java -cp .;/path/to/file1.jar;/path/to/file2.jar com.example.MyClass
(如果您使用的是Unix / Linux,请使用冒号而不是分号作为路径分隔符)
答案 2 :(得分:2)
在cloudera-quickstart-vm-5.8.0中运行Eclipse Luna 2(4.4.2)我必须添加以下内容
......然后它没有错误地工作
答案 3 :(得分:0)
当我遇到这个问题时,结果发现当我将Fluent API添加为Maven依赖项时,它导入的HTTPClient API的版本与我已经使用的版本不同。这两个版本的API都打包在生成的JAR的lib文件夹中。版本冲突是导致此错误的原因。
向类路径添加条目将解决问题,因为您只需手动指定要使用的版本。但是,要修复底层问题,我只需要在重建之前删除我的目标文件夹(或运行maven clean)。这删除了任何“缓存”库JAR,并在下一个版本中,只重新下载了正确的库。
希望能帮助别人!