15

我正在尝试从 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 文件?预先感谢您的帮助。

4

5 回答 5

7

此异常表明运行时类路径中缺少提到的类。

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

如果通过java.exe -jar或双击文件将其作为 JAR 文件运行,则需要在Class-PathJAR 文件的条目中指定类路径MANIFEST.MF。请注意,无论何时执行 JAR ,%CLASSPATH%环境变量和-cp参数-classpath都会被忽略。

如果您通过 将它作为“普通的”Java 应用程序运行java.exe,那么您需要在-cpor-classpath参数中指定它。请注意,无论何时使用此参数,都会忽略%CLASSPATH%环境变量。

无论哪种方式,类路径都应该存在一个(半)冒号分隔的 JAR 文件路径字符串(绝对路径或相对于当前工作目录)。例如

java -cp .;/path/to/file1.jar;/path/to/file2.jar com.example.MyClass

(如果您使用的是 Unix/Linux,请使用冒号而不是分号作为路径分隔符)

于 2010-07-12T18:51:42.493 回答
5

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

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

于 2010-07-12T18:46:50.383 回答
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

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

于 2017-02-26T22:40:20.030 回答
0

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

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

希望对某人有所帮助!

于 2014-11-10T20:50:17.363 回答
0

当您遇到连接、发送等问题时,我只想对异常进行小幅改进……并且您想知道 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
于 2021-12-20T09:00:31.017 回答