我有一个Maven Java项目,它使用Mashape Unirest向其他URL发送HTTP请求。我目前正在写一个集成测试(使用TestNG的)发送使用Unirest一个正常的HTTP请求。当我通过Maven(通过Failsafe插件)运行集成测试时,请求被成功发送出去。然而,当我尝试运行通过Eclipse的集成测试,我不断收到以下错误:java.lang.NoSuchFieldError:org.apache.http.message.BasicLineFormatter.INSTANCE来自Mashape Unirest Java应用程序
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 JAR文件具有最新版本的BasicLineFormatter
。我知道,基于我项目中的Maven Dependencies JAR文件,我确实在使用这些Apache依赖项的最新版本,而不是指定为我的项目的下游依赖项的旧版本。
我也查了一下这个问题,其他的各种SOF和博客文章,如Mashape Unirest Java : java.lang.NoClassDefFoundError和this blog post too,但他们似乎都在谈论解决NoSuchFieldError问题的的Android。但是,我正在处理独立的Java应用程序,而不是Android应用程序。
我在确定如何解决此问题方面处于困境。任何人都知道我需要做什么?
UPDATE
而不是显示我的测试情况下,我会减少这个问题,只是一个简单的一行Java应用程序的再现的例证,因为这个问题与任何Java应用程序或测试的情况下,通过运行存在Eclipse的,不只是一个特殊的测试:
System.out.println(Unirest.get("http://www.google.com").asStringAsync().get().getBody());
通常情况下,这应该打印的谷歌主页的HTML,但我反而得到NoSuchFieldError堆栈跟踪。
固定!
的问题是,AWS SDK(它在我的类路径中,因为我开发弹性魔豆)有冲突的JAR文件。使用奥列格的解决方案(感谢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 SDK不再是相互矛盾的。
是否也能提供您Java测试类? –
请参阅我的更新。 – ecbrodie
根据我的经验,NoSuchFieldError通常意味着您使用一个库/ jarfile版本进行编译,但是针对修改该类的另一个版本执行。如果您从一个环境迁移到另一个环境,请检查您的图书馆是否处于相同的级别(您可能需要拖动它们的私人副本并玩类加载器订购游戏),和/或根据新环境提供的版本进行重建。 – keshlam