繁体   English   中英

java.lang.NoClassDefFoundError: org/apache/http/client/HttpClient

[英]java.lang.NoClassDefFoundError: org/apache/http/client/HttpClient

我正在尝试从 GWT servlet 发出获取请求,以从 web 服务获取 JSON 响应。 以下是我的 servlet 中的代码:

public String getQueData() throws IllegalArgumentException {
    String message = null;
    try {           
        HttpClient httpclient = new DefaultHttpClient(); 
        JSONParser parser = new JSONParser();

        String url = "working - url";
        HttpResponse response = null;
        response = httpclient.execute(new HttpGet(url));

        JSONObject json_data = null;
        json_data = (JSONObject)parser.parse(EntityUtils.toString(response.getEntity()));
        JSONArray results = (JSONArray)json_data.get("result");
        for (Object queid : results) {
            message = message.concat((String) ((JSONObject)queid).get("id"));
            message = message.concat("\t");
            message = message.concat((String) ((JSONObject)queid).get("owner"));
            message = message.concat("\n");
        }
      } catch (Exception e) {
    message = e.toString();
    }
    return message;
}

尝试从 GWT servlet 发出获取请求时出现以下异常。

java.lang.NoClassDefFoundError: org/apache/http/client/HttpClient
    at java.lang.Class.getDeclaredConstructors0(Native Method)
    at java.lang.Class.privateGetDeclaredConstructors(Class.java:2389)
    at java.lang.Class.getConstructor0(Class.java:2699)
    at java.lang.Class.newInstance0(Class.java:326)
    at java.lang.Class.newInstance(Class.java:308)
    at org.mortbay.jetty.servlet.Holder.newInstance(Holder.java:153)
    at org.mortbay.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:428)
    at org.mortbay.jetty.servlet.ServletHolder.getServlet(ServletHolder.java:339)
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
    at com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:35)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:60)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:122)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.tools.development.BackendServersFilter.doFilter(BackendServersFilter.java:97)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
    at com.google.appengine.tools.development.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:78)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:362)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at org.mortbay.jetty.Server.handle(Server.java:326)
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
    at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:938)
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:755)
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218)
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
    at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
Caused by: java.lang.ClassNotFoundException: org.apache.http.client.HttpClient
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at com.google.appengine.tools.development.IsolatedAppClassLoader.loadClass(IsolatedAppClassLoader.java:176)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)

此异常的可能原因是什么? 怎么可能去掉?

我在 ubuntu 10.04 上使用 jdk1.6.0_30。

如果是 maven 项目,请在 pom 文件中添加以下依赖项

    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.3.4</version>
    </dependency>

此异常的可能原因是什么?

您的类路径中可能没有合适的 Jar。

怎么可能去掉?

通过将 HTTPClient jar 放在您的类路径中。 如果它是一个 web 应用程序,如果它是独立的,请将 Jar 复制到WEB-INF/lib ,确保您在类路径中有这个 jar 或使用-cp选项显式设置

正如医生所说,

如果 Java 虚拟机或 ClassLoader 实例尝试加载类的定义(作为正常方法调用的一部分或作为使用 new 表达式创建新实例的一部分)并且找不到类的定义,则抛出。

编译当前正在执行的类时,搜索到的类定义存在,但无法再找到该定义。

编辑:
如果您使用的是 Maven/Gradle(见下面的答案)或 SBT 等依赖项管理,请使用它为您带来 httpclient jar。

我自己解决了这个问题,我发现有两个 http-client 文件具有不同版本的其他依赖 jar 文件。 因此,库文件之间可能存在版本崩溃,因此删除所有旧的/以前的库文件并重新添加来自此 zip 文件的 lib 文件夹中的 jar 文件:

从这里下载 Zip 文件

我面临着同样的问题。 就我而言,我依赖旧版本的 httpclient,而 sendgrid 需要更新版本的 httpclient。 只需确保您的依赖项中的 httpclient 版本正确,它就可以正常工作。

如果存在不同的 jar 版本,则会出现此问题。 特别是 httpcore 和 httpclient 的版本。 使用相同版本的 httpcore 和 httpclient。

我通过导入以下依赖项解决了这个问题。 您必须手动导入 httpclient

<dependency>
    <groupId>commons-httpclient</groupId>
    <artifactId>commons-httpclient</artifactId>
    <version>3.1</version>
    <exclusions>
        <exclusion>
            <groupId>commons-logging</groupId>
            <artifactId>*</artifactId>
        </exclusion>
    </exclusions>
</dependency>

创建工件 Jar 后,我遇到了这个问题。 我这样做,我创建了一个新的Artifact > With Module Dependency >然后将主 Class 留空。 这样,在创建工件 jar 后,jar 运行正常。 我认为问题在于,来自 org.apache 和网络的 http-client - 这两种类型的 class 在我的第一个工件中同时用于不同的库,问题就出现了。 所以,当我创建新的 Artifact 并留下不必要的库和重复库时,问题就消失了。

我遇到了同样的问题,后来我发现我使用了错误的 gradle 依赖项。,

错误的:

compileOnly 'org.apache.httpcomponents:httpclient:4.5.3'

正确的:

implementation group: 'org.apache.httpcomponents', name: 'httpclient', version: '4.5.3'

一旦我改变它,它工作正常。

java.lang.NoClassDefFoundError on HttpAsyncClients.custom
java.lang.NoClassDefFoundError: org/apache/http/impl/nio/clien /CloseableHttpAsyncClient
java.lang.NoClassDefFoundError: org/apache/http/HttpHost 

您必须导入httpclient库。

Go 到 maven 网站并下载httpclient jar 文件。 https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient

现在您必须将此 jar 文件复制到 \lib 文件夹中。

之后查找 POM 文件并添加依赖项。 您可以在 maven 网站上查看依赖项代码。 只是 go 到结束代码行,添加以下依赖项。

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.13</version>
</dependency>

对于 Jira/Confluence,POM 文件的位置就是这样。 C:\Program Files\Atlassian\JIRA\atlassian-jira\META-INF\maven\com.atlassian.jira

此位置有两个文件夹:atlassian-jira-webapp 和 jira-webapp-dist。 这两个文件夹都包含 POM 文件。

只需在 notepad++ 中打开一个 POM 文件并搜索 end of。 在此处输入图像描述

现在 go 到第二个文件夹 POM 文件并添加相同的依赖项。 只需查看错误并添加依赖项。

之后重新启动您的服务。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM