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

升级到 ADT 22 后,库不再添加到 APK

轻松把玩HttpClient之封装HttpClient工具类,插件式配置HttpClient对象

Httpclient4.5.*HttpClient请求,对于新建httpclient实例时保持会话

HttpClient学习整理

httpclient简介说明