2010-07-12 82 views
12

我想从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并且文件编译正确。在运行时,我得到以下错误:HttpClient NoClassDefFoundError

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

回答

5

此例外说明运行时类路径中缺少上述类。

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

如果您通过java.exe -jar将它作为JAR文件运行或双击该文件,则需要在JAR的MANIFEST.MF文件的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,使用冒号而不是分号作为路径分隔符)

5

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

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

+0

使用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 2010-07-12 20:01:28

-1

与Maven这可以通过导入范围来完成。

0

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

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

希望帮助别人!

1

在cloudera-quickstart-vm-5.8中运行Eclipse Luna 2(4.4.2)。0我不得不添加以下

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

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