当前位置: 首页 > 面试题库 >

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

穆高澹
2023-03-14
问题内容

我有一个Maven Java项目,它使用 Mashape Unirest
将HTTP请求发送到其他URL。我目前正在编写一个集成测试(使用 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的Httpcore
Github存储库中检出了的源代码。在Github存储库中,请注意如何INSTANCE为4.3.x分支和主干分支定义字段,但在4.2.x等较旧的分支中则没有。但是,我确实4.3.2在项目中使用了version
,因此我应该为Httpcore使用JAR文件,该文件的最新版本为BasicLineFormatter。我知道,基于我项目中的Maven依赖项JAR文件,我确实使用的是这些Apache依赖项的最新版本,而不是指定为我的项目下游依赖项的旧版本。

我检查了有关此问题的其他各种SOF和博客文章,例如Mashape Unirest
Java:java.lang.NoClassDefFoundError和此博客文章,但他们似乎都在谈论解决 Android
的NoSuchFieldError问题。但是,我正在处理一个独立的Java应用程序,而不是一个Android应用程序

在确定如何解决此问题方面我很困惑。有人知道我需要做什么吗?

更新

我没有显示测试用例,而是将这个问题的重现性简化为一个简单的单行Java应用程序,因为通过Eclipse运行的任何Java应用程序或测试用例都存在该问题,而不仅仅是一个特定的测试:

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

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

固定!

问题在于, AWS开发工具包 (位于我的类路径中,因为我正在为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


 类似资料:
  • 问题内容: 您是否知道任何允许为cookie设置自定义标志的Java cookie实现?似乎只有一组严格限制的标志可以添加。 问题答案: 我不是JEE专家,但是我认为由于cookie属性是一项新发明,因此您不能期望它会出现在Java EE 7接口或实现中。本类缺少通用性的制定者,因为它似乎。但不要将Cookie添加到您的via 您只需通过设置相应的HTTP标头字段即可 更新: 感谢 @mwyrzy

  • 下载jython-standalone-2.7.0.jar - 用于在其官方下载页面中嵌入Jython的Java应用程序: http://www.jython.org/downloads.html : jython-standalone-2.7.0.jar并将此jar文件包含在Java CLASSPATH环境变量中。 该库包含PythonInterpreter类。 使用此类的对象,可以使用exec

  • 问题内容: 与在内置的Web服务器上运行独立的Java应用程序并在反向代理后面运行相比,构建一个小型的Java Web应用程序以在Servlet容器(如Tomcat)中运行的优势是什么? 我已经使用Java大约一年了。我注意到启动Tomcat需要时间,并且由于类加载器问题,并非总是可以进行热重新部署。Servlet API在我看来有些令人费解,尤其是从配置和RESTful设计的角度来看(实际上并没

  • 问题内容: 我不是在寻找java-web- start,而是在寻找胖客户端应用程序安装工具包。我有一个独立的应用程序,其中包含几个文件(jar文件,数据文件等),并且需要执行一些非常标准的安装任务,例如向用户询问目标目录,让他们找到系统的某些部分- 选择一些按计算机或按用户配置的选项,并可能尝试检测它们的某些计算机设置。 我正在寻找类似于MSI或其他向导驱动的安装应用程序的东西。什么是Java的良

  • 我尝试在JAVA代码中调用MessageBoxA函数。以下方法有什么问题,以至于我的程序抛出了很多错误? 1-st: run:线程“main”java.lang.ClassFormatError:java.lang.ClassLoader的类文件加载/库/MessageBox中的本机或抽象方法中的代码属性。java.lang.ClassLoader.defineClass(ClassLoader.

  • 问题内容: 我在RapidMiner中有一个文本分类过程。它从指定的excel ssheet读取测试数据并进行分类。我还有一个小型Java应用程序,它正在运行此过程。现在,我想在应用程序中添加文件输入部分,以便每次我都可以从应用程序(而不是RapidMiner)中指定excel文件。有什么提示吗? 这是代码: 这是错误: 最好的祝福 Armen 问题答案: 我看到两种方法可以做到这一点。 第一个方