HttpClient NoClassDefFoundError
Posted
技术标签:
【中文标题】HttpClient NoClassDefFoundError【英文标题】: 【发布时间】:2010-07-12 18:41:54 【问题描述】:我正在尝试从 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 文件?提前感谢您的帮助。
【问题讨论】:
【参考方案1】:此异常表明 runtime 类路径中缺少提到的类。
有几种方法可以指定运行时类路径,具体取决于您执行程序的方式。由于一个体面的 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,请使用冒号而不是分号作为路径分隔符)
【讨论】:
【参考方案2】:该类在 httpclient-4.0.1.jar 中(我刚刚下载了它以确保它)所以我怀疑你没有正确地将它放在类路径中。
你是如何编译和运行你的代码的?
【讨论】:
使用文本板。它与 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 编译正常,但不运行。【参考方案3】:在 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...然后它没有错误地工作
【讨论】:
【参考方案4】:当我遇到这个问题时,事实证明,当我将 Fluent API 添加为 Maven 依赖项时,它导入的 HTTPClient API 版本与我已经使用的版本不同。两个版本的 API 都打包在生成的 JAR 的 lib 文件夹中。版本冲突是导致此错误的原因。
向您的类路径添加条目将解决问题,因为您只是手动指定要使用的版本。但是,为了解决根本问题,我只需要在重建之前删除我的目标文件夹(或运行 maven clean)。这删除了所有“缓存”的库 JAR,并且在下一次构建时,只重新下载了正确的 JAR。
希望对某人有所帮助!
【讨论】:
【参考方案5】:当您遇到连接、发送等问题时,我只想对 Exception 进行小幅改进......并且您想知道 WAY。
httpclient-4.5.13.jar
httpcore-4.5.13.jar
+++ for Exception +++
javax.activation-api-1.2.0.jar
javax.annotation-api-1.3.2.jar
javax.xml.soap-api-1.4.0.jar
jaxb-api-2.3.1.jar
public static boolean sendEmailViaExchange( String strUserName, String strPassword, String strDomain, String strURI, String strRecipient, String strSubject, String strMessageBody ) // BYTE attachment
try // e-mail
ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010_SP2);
service.setCredentials(new WebCredentials(strUserName, strPassword, strDomain));
service.setUrl( new URI( strURI ) );
EmailMessage msg= new EmailMessage(service);
msg.setSubject( strSubject );
msg.setBody(MessageBody.getMessageBodyFromText( strMessageBody ));
msg.getToRecipients().add( strRecipient );
msg.send();
catch (Exception e) // try // e-mail
LOGGER.log(Level.SEVERE, "ERROR: " + e.getMessage());
return false;
// try // e-mail catch (Exception e)
return true;
// public static boolean sendEmailViaExchange( String strUserName, String strPassword, String strDomain, String strURI, String strRecipient, String strSubject, String strMessageBody ) // BYTE attachment
【讨论】:
以上是关于HttpClient NoClassDefFoundError的主要内容,如果未能解决你的问题,请参考以下文章
轻松把玩HttpClient之封装HttpClient工具类,插件式配置HttpClient对象