gpt4 book ai didi

java.lang.NoSuchFieldError : org. apache.http.message.BasicLineFormatter.INSTANCE 来自 Java 应用程序中的 Mashape Unirest

转载 作者:IT老高 更新时间:2023-10-28 20:50:37 25 4
gpt4 key购买 nike

我有一个使用 Mashape Unirest 的 Maven Java 项目。用于向其他 URL 发送 HTTP 请求。我目前正在编写一个集成测试(使用 TestNG),它使用 Unirest 发送一个正常的 HTTP 请求。当我通过 Maven(通过 Failsafe 插件)运行集成测试时,请求已成功发送。但是,当我尝试通过 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>

我还检查了 BasicLineFormatter.java 的源代码,来自下载到 Eclipse 和 Apache's Httpcore Github repo 的源文件。 .在 Github 存储库中,请注意 INSTANCE 字段是如何为 4.3.x 分支和主干分支定义的,但在像 4.2.x 这样的旧分支中却没有。但是,我确实在我的项目中使用版本 4.3.2,所以我应该为 Httpcore 使用具有最新版本 BasicLineFormatter 的 JAR 文件。我知道,基于我项目中的 Maven 依赖项 JAR 文件,我确实使用了这些 Apache 依赖项的最新版本,而不是指定为我项目下游依赖项的旧版本。

我查看了其他各种关于此问题的 SOF 和博客文章,例如 Mashape Unirest Java : java.lang.NoClassDefFoundErrorthis blog post too ,但他们似乎都在谈论解决 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 的解决方案(感谢 BTW),我在单元测试中打印了以下输出:

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 开发工具包不再冲突。

最佳答案

对这个问题唯一合理的解释是类路径上有一个旧版本的 HttpCore(除非你还想考虑来自火星的绿人从飞碟远程弄乱你的计算机的可能性)。

您可以将此代码段添加到您的代码中,以找出该类是从哪个 jar 中提取的。这可能有助于找出为什么该 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

关于java.lang.NoSuchFieldError : org. apache.http.message.BasicLineFormatter.INSTANCE 来自 Java 应用程序中的 Mashape Unirest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21864521/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com