Apache HTTP客户端Android库的Android问题 [英] Android Issues with Apache http client android library
问题描述
这是我正在使用的库: https://github.com/clickntap/Vimeo
我正在尝试将该库用于Android应用.我的测试设备是Kitkat(4.4.4).
这是我的gradle配置:
compileSdkVersion 25
buildToolsVersion "25.0.3"
useLibrary 'org.apache.http.legacy'
defaultConfig {
applicationId "my.app.package"
minSdkVersion 16
targetSdkVersion 25
versionCode 1
versionName "1.0.0-alpha"
}
这是我添加库的方式:
compile 'com.clickntap:vimeo:1.10'
但是我在Vimeo.addVideo()
上收到以下错误:
java.lang.NoClassDefFoundError: org.apache.http.impl.client.HttpClientBuilder
和警告:
WARNING: Dependency org.apache.httpcomponents:httpclient:4.3.6 is ignored for debug as it may be conflicting with the internal version provided by Android.
WARNING: Dependency org.json:json:20140107 is ignored for debug as it may be conflicting with the internal version provided by Android.
所以我搜索了一下,发现我可以做这样的事情:
compile 'org.apache.httpcomponents:httpclient-android:4.3.5.1'
compile('com.clickntap:vimeo:1.10') {
exclude group: 'org.apache.httpcomponents'
exclude group: 'org.json'
}
但是现在我仍然在Vimeo.addVideo()
上收到此错误,找不到任何解决方案:
java.lang.NoSuchMethodError: org.apache.http.entity.FileEntity.<init>
请帮助:(
谢谢
P.S. 这是第一种情况的堆栈跟踪:
Caused by: java.lang.NoClassDefFoundError: org.apache.http.impl.client.HttpClientBuilder
at com.clickntap.vimeo.Vimeo.apiRequest(Vimeo.java:218)
at com.clickntap.vimeo.Vimeo.beginUploadVideo(Vimeo.java:122)
at com.clickntap.vimeo.Vimeo.addVideo(Vimeo.java:138)
at my.app.package.VimeoActivity$6.subscribe(VimeoActivity.java:163) // my activity
at io.reactivex.internal.operators.single.SingleCreate.subscribeActual(SingleCreate.java:39)
at io.reactivex.Single.subscribe(Single.java:2702)
at io.reactivex.internal.operators.single.SingleSubscribeOn$SubscribeOnObserver.run(SingleSubscribeOn.java:89)
at io.reactivex.Scheduler$DisposeTask.run(Scheduler.java:451)
at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:61)
at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:52)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:152)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:265)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)
这是第二种情况,其中包括httpclient-android
:
Caused by: java.lang.NoSuchMethodError: org.apache.http.entity.FileEntity.<init>
at com.clickntap.vimeo.Vimeo.apiRequest(Vimeo.java:247)
at com.clickntap.vimeo.Vimeo.uploadVideo(Vimeo.java:126)
at com.clickntap.vimeo.Vimeo.addVideo(Vimeo.java:140)
at my.app.package.VimeoActivity$6.subscribe(VimeoActivity.java:163) // my activity
at io.reactivex.internal.operators.single.SingleCreate.subscribeActual(SingleCreate.java:39)
at io.reactivex.Single.subscribe(Single.java:2702)
at io.reactivex.internal.operators.single.SingleSubscribeOn$SubscribeOnObserver.run(SingleSubscribeOn.java:89)
at io.reactivex.Scheduler$DisposeTask.run(Scheduler.java:451)
at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:61)
at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:52)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:152)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:265)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)
Android版本< 6嵌入了Apache HTTP Client 4.0.beta快照的分支(
在上面的示例中,Vimeo库直接使用 This is the library that I'm using:
https://github.com/clickntap/Vimeo I'm trying to use the library for an Android app. My test device is Kitkat (4.4.4). Here's my gradle config: Here's how I added the library: But I receive the following error on and warnings: So I searched a little and found that I could do something like this: But now I'm receiving this error still on Please help :( Thanks, P.S.
Here's the stack trace for the 1st scenario: And here's for the 2nd scenario, where the
Android version<6 embedded a fork of Apache HTTP Client 4.0.beta snapshot (https://hc.apache.org/httpcomponents-client-4.3.x/android-port.html). The 1st scenario fails because The 2nd scenario fails because you are using both I would suggest to use the dependencies as in the 2nd scenario, but remove This solution will work with any dependency on Update This solution will not work if your code or any of your dependencies use explicitly an API that has been replaced in the httpclient-android library in order to not conflict with the legacy httpclient version of the Android SDK.
org.apache.httpcomponents:httpclient provides builders (e.g. HttpClientBuilder, EntityBuilder, MultipartEntityBuilder) which abstract the actual classes being used, that should be preferred. Unfortunately, both accessing "internal" classes/APIs and using Builders is possible (probably to maintain compatibility), but I believe that a single clean way should be permitted by the library. In the above example, Vimeo library directly uses 这篇关于Apache HTTP客户端Android库的Android问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!FileEntity
构造函数,该构造函数将库与特定类耦合,而如果使用EntityBuilder
,则可以将其解耦.因此,我唯一能看到的就是修改库的源代码,使其与httpclient-android库和一般的Android兼容.compileSdkVersion 25
buildToolsVersion "25.0.3"
useLibrary 'org.apache.http.legacy'
defaultConfig {
applicationId "my.app.package"
minSdkVersion 16
targetSdkVersion 25
versionCode 1
versionName "1.0.0-alpha"
}
compile 'com.clickntap:vimeo:1.10'
Vimeo.addVideo()
:java.lang.NoClassDefFoundError: org.apache.http.impl.client.HttpClientBuilder
WARNING: Dependency org.apache.httpcomponents:httpclient:4.3.6 is ignored for debug as it may be conflicting with the internal version provided by Android.
WARNING: Dependency org.json:json:20140107 is ignored for debug as it may be conflicting with the internal version provided by Android.
compile 'org.apache.httpcomponents:httpclient-android:4.3.5.1'
compile('com.clickntap:vimeo:1.10') {
exclude group: 'org.apache.httpcomponents'
exclude group: 'org.json'
}
Vimeo.addVideo()
and can't find any solution:java.lang.NoSuchMethodError: org.apache.http.entity.FileEntity.<init>
Caused by: java.lang.NoClassDefFoundError: org.apache.http.impl.client.HttpClientBuilder
at com.clickntap.vimeo.Vimeo.apiRequest(Vimeo.java:218)
at com.clickntap.vimeo.Vimeo.beginUploadVideo(Vimeo.java:122)
at com.clickntap.vimeo.Vimeo.addVideo(Vimeo.java:138)
at my.app.package.VimeoActivity$6.subscribe(VimeoActivity.java:163) // my activity
at io.reactivex.internal.operators.single.SingleCreate.subscribeActual(SingleCreate.java:39)
at io.reactivex.Single.subscribe(Single.java:2702)
at io.reactivex.internal.operators.single.SingleSubscribeOn$SubscribeOnObserver.run(SingleSubscribeOn.java:89)
at io.reactivex.Scheduler$DisposeTask.run(Scheduler.java:451)
at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:61)
at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:52)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:152)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:265)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)
httpclient-android
is included:Caused by: java.lang.NoSuchMethodError: org.apache.http.entity.FileEntity.<init>
at com.clickntap.vimeo.Vimeo.apiRequest(Vimeo.java:247)
at com.clickntap.vimeo.Vimeo.uploadVideo(Vimeo.java:126)
at com.clickntap.vimeo.Vimeo.addVideo(Vimeo.java:140)
at my.app.package.VimeoActivity$6.subscribe(VimeoActivity.java:163) // my activity
at io.reactivex.internal.operators.single.SingleCreate.subscribeActual(SingleCreate.java:39)
at io.reactivex.Single.subscribe(Single.java:2702)
at io.reactivex.internal.operators.single.SingleSubscribeOn$SubscribeOnObserver.run(SingleSubscribeOn.java:89)
at io.reactivex.Scheduler$DisposeTask.run(Scheduler.java:451)
at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:61)
at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:52)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:152)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:265)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)
HttpClientBuilder
was introduced on httpclient:4.3.useLibrary 'org.apache.http.legacy'
that loads the legacy httpclient library and compile 'org.apache.httpcomponents:httpclient-android:4.3.5.1'
. Vimeo client uses a FileEntity constructor that did not exist in the legacy library, which exists in the classpath and takes priority over the httpclient-android version of the FileEntity class.useLibrary 'org.apache.http.legacy'
. httpcomponents:httpclient
if you are using APIs that were introduced before or on 4.3.5.1 and not later, assuming that the public API of the httpclient-android library is identical to the httpcomponents:httpclient library of the same version.FileEntity
constructor, which couples the library with a specific class, while this could be decoupled, if the EntityBuilder
was used. So the only way I can see, is to modify the library source code, to make it compatible with httpclient-android library and Android in general.