项目引入了 okhttp3 4.0 第三方库用的是 okhttp3 3.x
运行时报错:
java.lang.NoSuchMethodError: No static method create(Lokhttp3/internal/io/FileSystem;Ljava/io/File;IIJ)Lokhttp3/internal/cache/DiskLruCache; in class Lokhttp3/internal/cache/DiskLruCache; or its super classes (declaration of 'okhttp3.internal.cache.DiskLruCache' appears in /data/app/com.aliyun.iot.demo-o1CF4XvCIWdp1hjYbjioGA==/base.apk!classes3.dex)
请问有办法指定第三方子依赖的版本吗?或者禁止高版本替换第三方库子依赖的低版本
简而言之就是能不能我项目继续用 4.0,第三方库子依赖的版本不被替换
1
ReasonLee 2020-03-24 11:40:16 +08:00
exclude
|
2
nicevar 2020-03-24 11:41:29 +08:00
exclude 指定的 group 或者包
|
3
wvitas 2020-03-24 11:41:31 +08:00
楼上正解
|
4
Gehrman OP 是在第三方库下面 加 exclude okhttp 吗?
我之前在自己项目的 okhttp 下 exclude 了第三方库,没有用。 是我的方法错了? |
5
JsonLee 2020-03-24 13:32:31 +08:00 via iPhone
引入第三方类库的时候 exclude 掉 okhttp,不过慎重使用就是了,除非你能保证第三方类库所使用的 okhttp 的 API 在 4.*的版本上也有且行为一致,不然就会埋下祸根。
|
6
Gehrman OP @JsonLee 目前就是因为不一致,所以想知道有没有办法让第三方库使用自己指定的版本 3.x,自己的项目仍然用 4.0 。
|
7
wuketidai 2020-03-24 13:46:36 +08:00
用 jarjar 把 第三方依赖重打包下
|
8
nicevar 2020-03-24 13:53:39 +08:00
@Gehrman 你用 exclude 之后,第三方库也就是使用你的 4.0 库,但是不能保证不出问题,如果 3.x 到 4 的 api 有不兼容的情况就可能无法正常工作了,所以你要自己看一下 okhttp 的 releasenote 才知道,我记得 okhttp 3.13.1 之后需要 android 5+才行,也就是 4.x 系统的不支持了,如果你执意要使用 okhttp 4.0,又出现不兼容的第三方库,那只能去找第三方库的源码自己修改,或者提个 issue 等着
|
9
Gehrman OP @nicevar 现在是有兼容问题,搞了一上午好像没什么好解,@wuketidai 的方法好像有点可行性,但是得跟着第三方库升级重新打包,还是降回去算了
|
10
DeweyReed 2020-03-24 14:07:19 +08:00
错误信息是第三方库用了 okhttp3 的内部的一个类(okhttp3/internal/cache/DiskLruCache),exclude 后第三方库(像是阿里的?)代码不会变的呀,exclude 应该没用。
有第三方库的代码的话,自己去把引用了 internal 的类改一下(把 okhttp3.internal.cache.DiskLruCache 换成 Jake Wharton 老大的那一个单独库试试,或者直接复制代码),然后自己打包 AAR 。 乱用 internal 下的类在国产 SDK 里挺常见的,没办法(摊手 |
11
HangoX 2020-03-24 14:17:53 +08:00
exclude 没用,因为你这个第三方使用的包用了一个 ok3.x 版本的才有的方法,去掉了就会报错。如果你强硬使用 4.0 的话,只能把这个第三方的包用的 ok 方法补回来,方法有自己编一个,或者建立一个一样包名的类,实现这个方法
|