Android SDK 与 Apache HTTP 在 API 23 更新后发生冲突
Conflict between Android SDK and Apache HTTP after API 23 update
在我的项目中,我使用了这些库:
compile 'org.apache.httpcomponents:httpclient:4.5.2'
compile 'org.apache.httpcomponents:httpcore:4.4.4'
一切正常,直到我为 API 23 更新了 Android 工具。然后当我尝试执行 HttpPost 时,出现以下异常:
java.lang.NoSuchFieldError: INSTANCE
at org.apache.http.conn.ssl.SSLConnectionSocketFactory.<clinit>(SSLConnectionSocketFactory.java:144)
at org.apache.http.impl.client.HttpClientBuilder.build(HttpClientBuilder.java:966)
at org.apache.http.impl.client.HttpClients.createDefault(HttpClients.java:58)
这是它发生的库代码:
public class SSLConnectionSocketFactory implements LayeredConnectionSocketFactory {
public static final String TLS = "TLS";
public static final String SSL = "SSL";
public static final String SSLV2 = "SSLv2";
@Deprecated
public static final X509HostnameVerifier ALLOW_ALL_HOSTNAME_VERIFIER
= AllowAllHostnameVerifier.INSTANCE;
查看外部库时,我可以看到 android.jar 下的 AllowAllHostnameVerifier
class:
当使用此问题答案中的代码时:
我得到这个输出:
jar:file:/E:/Program%20Files/Eclipse%20Android%20SDK/adt-bundle-windows-x86_64-20140702/sdk/platforms/android-23/android.jar!/org/apache/http/conn/ssl/AllowAllHostnameVerifier.class
所以我可以看到构建是从 SDK 而不是从 Apache 库中获取这个 class。
所以问题是,如何修复我的 class 路径或其他必要的配置,以指示构建使用这些 classes 像以前一样来自 Apache 而不是来自 SDK?
提前致谢!
简而言之,只需编辑 android.jar
文件,删除 类 需要被 Apache 库替换的内容。
在我的项目中,我使用了这些库:
compile 'org.apache.httpcomponents:httpclient:4.5.2'
compile 'org.apache.httpcomponents:httpcore:4.4.4'
一切正常,直到我为 API 23 更新了 Android 工具。然后当我尝试执行 HttpPost 时,出现以下异常:
java.lang.NoSuchFieldError: INSTANCE
at org.apache.http.conn.ssl.SSLConnectionSocketFactory.<clinit>(SSLConnectionSocketFactory.java:144)
at org.apache.http.impl.client.HttpClientBuilder.build(HttpClientBuilder.java:966)
at org.apache.http.impl.client.HttpClients.createDefault(HttpClients.java:58)
这是它发生的库代码:
public class SSLConnectionSocketFactory implements LayeredConnectionSocketFactory {
public static final String TLS = "TLS";
public static final String SSL = "SSL";
public static final String SSLV2 = "SSLv2";
@Deprecated
public static final X509HostnameVerifier ALLOW_ALL_HOSTNAME_VERIFIER
= AllowAllHostnameVerifier.INSTANCE;
查看外部库时,我可以看到 android.jar 下的 AllowAllHostnameVerifier
class:
当使用此问题答案中的代码时:
我得到这个输出:
jar:file:/E:/Program%20Files/Eclipse%20Android%20SDK/adt-bundle-windows-x86_64-20140702/sdk/platforms/android-23/android.jar!/org/apache/http/conn/ssl/AllowAllHostnameVerifier.class
所以我可以看到构建是从 SDK 而不是从 Apache 库中获取这个 class。
所以问题是,如何修复我的 class 路径或其他必要的配置,以指示构建使用这些 classes 像以前一样来自 Apache 而不是来自 SDK?
提前致谢!
简而言之,只需编辑 android.jar
文件,删除 类 需要被 Apache 库替换的内容。