java version "1.7.0_71"
Gradle 2.1
您好,
UPDATE:
依赖项
gradle dependencies | grep httpcore
| +--- org.apache.httpcomponents:httpcore:4.3.3
| +--- org.apache.httpcomponents:httpcore:4.3.3
| +--- org.apache.httpcomponents:httpcore:4.3.3
| +--- org.apache.httpcomponents:httpcore:4.3.3
| | | | | +--- org.apache.httpcomponents:httpcore:4.1 -> 4.3.3
| +--- org.apache.httpcomponents:httpcore:4.3.3
| | | | | +--- org.apache.httpcomponents:httpcore:4.1 -> 4.3.3
这是否意味着我有一个4.1到4.3.3的软链接(soft link)?似乎很奇怪,当我打印出类加载器正在加载的内容时,似乎加载了4.3.3:
/home/steve/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpcore/4.3.3/f91b7a4aadc5cf486df6e4634748d7dd7a73f06d/httpcore-4.3.3.jar
看起来很奇怪。当我尝试运行我的httpClient时,我一直收到此错误。一切都可以编译。
java.lang.NoSuchFieldError: INSTANCE
at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.<init>(DefaultHttpRequestWriterFactory.java:52
我的代码非常简单,删除了不重要的代码以使其保持较小:
public class GenieClient {
private CloseableHttpClient mClient;
public GenieClient() {
ClassLoader classLoader = GenieClient.class.getClassLoader();
URL resource = classLoader.getResource("org/apache/http/message/BasicLineFormatter.class");
log.log(Level.INFO, "resource: " + resource);
mClient = HttpClientBuilder.create().build();
}
public int sendRequest() {
int responseCode = -1;
try {
HttpResponse response = mClient.execute(new HttpPost("http://www.google.com"));
responseCode = response.getStatusLine().getStatusCode();
}
catch(IOException ex) {
log.log(Level.SEVERE, "IOException: " + ex.getMessage());
}
return responseCode;
}
}
我从classLoader获得的输出是这样的:
INFO: resource: jar:file:/home/steve/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpcore/4.3.3/f91b7a4aadc5cf486df6e4634748d7dd7a73f06d/httpcore-4.3.3.jar!/org/apache/http/message/BasicLineFormatter.class
我正在使用gradle作为构建工具,并在
build.gradle
文件中设置了类似的依赖项:dependencies {
compile 'org.apache.httpcomponents:httpclient:4.3.6'
}
我也尝试包括以下httpcore,但仍然出现相同的错误:
compile 'org.apache.httpcomponents:httpcore:4.4'
一切正常,只有当我运行httpClient时,
非常感谢您的任何建议,
最佳答案
org.apache.httpcomponents:httpcore:4.1 -> 4.3.3
表示4.1
是请求的版本,通过冲突解决将其解析为4.3.3
。执行类似gradle -q dependencyInsight --configuration compile --dependency httpcore
的操作可以使您对此有更多的了解。
您应该检查构建输出,并查看应用程序实际打包了哪些jar。另外,使用一些文件管理器通过构建输出(当然包括归档文件)运行对BasicLineFormatter.class
的搜索,这应该为您提供明确的答案,哪些jar包含此类的哪个版本。
如果只有一个版本(4.3.3),则必须表示另一个版本来自运行您的应用程序的容器。解决这个问题的方法取决于容器。
如果确实找到多个版本,则可以尝试在项目中全局排除对httpcore
的传递依赖(user guide的第51.4.7章)。