当前位置: 首页 > 知识库问答 >
问题:

JAVAlang.NoSuchFieldError:org。阿帕奇。http。消息基础倾斜变形器。Java应用程序中Mashape Unirest的实例

何高旻
2023-03-14

我有一个MavenJava项目,它使用Mashape Unirest向其他URL发送HTTP请求。我目前正在编写一个集成测试(使用TestNG),它使用Unirest发送一个普通的HTTP请求。当我通过Maven(通过故障安全插件)运行集成测试时,请求会成功发送出去。但是,当我试图通过Eclipse运行集成测试时,我总是得到以下错误:

FAILED: getCurrentTimeTest
java.lang.NoSuchFieldError: INSTANCE
    at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.<init>(DefaultHttpRequestWriterFactory.java:52)
    at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.<init>(DefaultHttpRequestWriterFactory.java:56)
    at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.<clinit>(DefaultHttpRequestWriterFactory.java:46)
    at org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.<init>(ManagedHttpClientConnectionFactory.java:72)
    at org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.<init>(ManagedHttpClientConnectionFactory.java:84)
    at org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.<clinit>(ManagedHttpClientConnectionFactory.java:59)
    at org.apache.http.impl.conn.PoolingHttpClientConnectionManager$InternalConnectionFactory.<init>(PoolingHttpClientConnectionManager.java:487)
    at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:147)
    at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:136)
    at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:112)
    at org.apache.http.impl.client.HttpClientBuilder.build(HttpClientBuilder.java:726)
    at com.mashape.unirest.http.options.Options.refresh(Options.java:41)
    at com.mashape.unirest.http.options.Options.<clinit>(Options.java:27)
    at com.mashape.unirest.http.HttpClientHelper.prepareRequest(HttpClientHelper.java:141)
    at com.mashape.unirest.http.HttpClientHelper.requestAsync(HttpClientHelper.java:80)
    at com.mashape.unirest.request.BaseRequest.asStringAsync(BaseRequest.java:56)
    at ...

我还能够使用基本的Java应用程序脚本重现此错误。

我已经确定了我在pom中使用的依赖项。xml文件是最新和最好的,如下所示:

<dependency>
    <groupId>com.mashape.unirest</groupId>
    <artifactId>unirest-java</artifactId>
    <version>1.3.5</version>
</dependency>
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.3.2</version>
</dependency>
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpasyncclient</artifactId>
    <version>4.0</version>
</dependency>
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpmime</artifactId>
    <version>4.3.2</version>
</dependency>
<dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20140107</version>
</dependency>
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpcore</artifactId>
    <version>4.3.2</version>
</dependency>

我还查看了basiclineformter的源代码。java,来自下载到Eclipse的源文件和Apache的Httpcore Github repo。在Github repo中,请注意如何为4.3定义实例字段。x分支和主干分支,但不在较旧的分支(如4.2)中。x、 然而,我确实在使用版本4.3。2在我的项目中,因此我应该为Httpcore使用一个JAR文件,该文件具有最新版本的basiclineformter。我知道,基于项目中的Maven Dependencies JAR文件,我确实在使用这些Apache依赖项的最新版本,而不是指定为项目下游依赖项的旧版本。

我已经查看了关于这个问题的其他各种软件和博客文章,比如Mashape Unirest Java:Java。NoClassDefFoundError和这篇博文,但他们似乎都在谈论解决Android的NoSuchFieldError问题。然而,我处理的是一个独立的Java应用程序,而不是Android应用程序。

我不知道如何解决这个问题。有人知道我需要做什么吗?

我将不再展示我的测试用例,而是将这个问题的再现简化为一个简单的单行Java应用程序,因为问题存在于通过Eclipse运行的任何Java应用程序或测试用例中,而不仅仅是一个特定的测试:

System.out.println(Unirest.get("http://www.google.com").asStringAsync().get().getBody());

通常,这应该打印Google主页的HTML,但我得到的是NoSuchFieldError堆栈跟踪。

问题是AWS SDK(它在我的类路径上,因为我正在为Elastic Beanstalk开发)有一个冲突的JAR文件。使用Oleg的解决方案(谢谢,顺便说一句),我在单元测试中打印了以下输出:

jar:file:/some/path/aws-java-sdk/1.7.1/third-party/httpcomponents-client-4.2.3/httpcore-4.2.jar!/org/apache/http/message/BasicLineFormatter.class

我必须重新安排我的类路径,以便AWS SDK不再冲突。

共有3个答案

林俊英
2023-03-14

我在使用unirest时遇到了同样的例外:

java.lang.NoSuchFieldError: INSTANCE
        at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.<init>(DefaultHttpRequestWriterFactory.java:52)
at com.mashape.unirest.http.options.Options.refresh(Options.java:55)
at com.mashape.unirest.http.options.Options.<clinit>(Options.java:36)

并发现这是由于DefaultConnectionKeepAliveStrategy。INSTANCE;和冲突的jar是apache-httpcomponents-httpclient.jar在我的类路径中。添加这篇文章来帮助任何面临类似例外的人

郦楷
2023-03-14

所以,首先要确认,错误的罐子被捡起,使用下面一行代码-

ClassLoader classLoader = <Your Class>.class.getClassLoader();
URL resource = classLoader.getResource("org/apache/http/message/BasicLineFormatter.class");
System.out.println(resource);

如果打印的是jar的较低版本,则确认它选择的是httpcore jar的较低版本(可能来自项目的其他依赖项),

解决方案-

在依赖列表的顶部添加以下maven/gradle依赖项(或在导致冲突的其他项目依赖项之上)-

<dependency>
     <groupId>com.mashape.unirest</groupId>
     <artifactId>unirest-java</artifactId>
     <version>1.4.5</version>
</dependency>
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpcore</artifactId>
    <version>4.4.1</version>
</dependency>
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.4.1</version>
</dependency>
公孙茂学
2023-03-14

对这个问题的唯一合理解释是,在类路径上有一个旧版本的HtpCype(除非你还想考虑一下来自Mars的绿色人从飞碟上远程干扰你的计算机的可能性)。

您可以将此代码段添加到代码中,以找出该类是从哪个jar获取的。这可能有助于找出为什么那个罐子首先在你的类路径上。

ClassLoader classLoader = MyClass.class.getClassLoader();
URL resource = classLoader.getResource("org/apache/http/message/BasicLineFormatter.class");
System.out.println(resource);

这基本上告诉我,在我的例子中,jar驻留在本地maven存储库中,很可能是由maven添加到类路径中的

jar:file:/home/oleg/.m2/repository/org/apache/httpcomponents/httpcore/4.3.1/httpcore-4.3.1.jar!/org/apache/http/message/BasicLineFormatter.class
 类似资料:
  • Apache Kafka:分布式消息传递系统 Apache Storm:实时消息处理 我们如何在实时数据管道中使用这两种技术来处理事件数据? 在实时数据管道方面,我觉得两者做的工作是一样的。如何在数据管道上同时使用这两种技术?

  • 问题内容: 我正在尝试创建如下图所示的形状,仅在一侧(例如,底侧)具有倾斜的边缘,而其他边缘保持笔直。 我尝试使用border方法(下面给出了代码),但是形状的尺寸是动态的,因此无法使用此方法。 我也尝试过使用渐变作为背景(例如下面的代码),但是随着尺寸的变化,它变得混乱了。您可以将鼠标悬停在以下代码段的形状上,以了解我的意思。 如何创建具有倾斜侧面的形状,并且还能够支持动态尺寸? 问题答案: 有

  • 我对骆驼生产商有很好的了解,但我不能对各种骆驼消费者保持清醒的头脑。特别是事件驱动消费者和轮询消费者,camel如何知道为这些消费者调用回调? 消费者的一般流量是多少?

  • 我正在使用Flink从Apache Pulsar读取数据。我在pulsar中有一个分区主题,有8个分区。在本主题中,我生成了1000条消息,分布在8个分区中。我的笔记本电脑中有8个内核,因此我有8个子任务(默认情况下,并行度=#个内核)。在执行Eclipse中的代码后,我打开了Flink UI,发现一些子任务没有收到任何记录(空闲)。我希望所有8个子任务都能得到利用(我希望每个子任务都映射到我的主

  • HTTP控制器 控制器决定了一个请求进来,应该如何被处理,控制器即是应用程序的心脏,一个控制器就是一个类文件,当请求进来,定位到控制器方法,就会执行其中的代码 控制器的命名和文件路径 控制器文件以及类的命名遵循大驼峰法(CamelCase),统一存放于 App\HttpController 目录下,让我们举一个例子,来感受一下控制器文件、类、与访问的URL之间互相的联系,假设有一个后台添加用户的操

  • 我们需要的是直接的API来设置和使用集群消息队列。我们最初的计划是使用Camel在集群JMS或ActiveMQ队列上进行消费/生产。Kafka如何使这项任务变得更容易?在任何一种情况下,应用程序本身都将在WebLogic服务器上运行。 消息传递将是点对点类型,其中有多个相同服务的实例在运行,但根据负载平衡策略,只有一个实例应该处理消息并发出结果。消息队列也是群集的,因此服务实例或队列实例的失败都不