【发布时间】:2018-09-08 04:58:24
【问题描述】:
我刚刚创建了一个库并上传到 bintray 和 jcenter。
在我的测试应用中,这个库被添加为一个模块:
implementation project(':dropdownview')
一切都很好。
库模块上传到jcenter后,我用这个代替:
implementation 'com.asksira.android:dropdownview:0.9.1
然后当库尝试调用依赖于另一个库的方法时,会发生运行时错误:
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.transitionseverywhere.TransitionSet" on path: DexPathList[[zip file "/data/app/com.asksira.dropdownviewdemo-6fj-Q2LdwKQcRAnZHd2jlw==/base.apk"],nativeLibraryDirectories=[/data/app/com.asksira.dropdownviewdemo-6fj-Q2LdwKQcRAnZHd2jlw==/lib/arm64, /system/lib64, /system/vendor/lib64]]
(我关注 this guide 发布库。我在使用相同方法之前发布了 3 个库,它们都运行良好;但这是我第一次在我自己的库中包含另一个 3rd 方库依赖项.)
编译与实现
然后我尝试将我的库的第 3 方库依赖项从
implementation 'com.andkulikov:transitionseverywhere:1.7.9'
到
compile 'com.andkulikov:transitionseverywhere:1.7.9'
(请注意,这不是应用程序对我的库的依赖,而是我的库对另一个库的依赖)
然后再次上传到 0.9.2 版本的 bintray。
implementation 'com.asksira.android:dropdownview:0.9.2
这次成功了?!
我的问题
这是 Android Studio / Gradle 的某种错误(但谷歌说他们将在 2018 年底之前删除 compile...),还是我做错了什么?
v0.9.1的完整源代码可以在here找到。
请注意,我没有直接从app 访问任何方法到TransitionsEverywhere。具体来说,ClassNotFoundException 在我点击DropDownView 时发生,DropDownView 调用expand() 这是public 内部方法。
更多信息
为了消除其他因素,以下是我在将implementation 更改为compile 之前尝试过的事情,都没有运气:
- 清理并重建
- 卸载应用 + 清理并重新构建
- 使应用程序成为 MultiDexApplication
- 即时运行已被禁用
【问题讨论】:
-
当你使用实现的时候,你还必须添加你的库的依赖库。所以在这种情况下,你必须在你的应用模块中添加这些依赖库。
-
@Chandrakanth 你确定是这样吗?据我所知,
implementation仅表示应用程序本身无法访问依赖项的依赖关系。不然怎么能完全取代被弃用的compile? -
@SiraLam 看看这个。 stackoverflow.com/questions/44493378/…
-
当您使用实现时,这意味着 lib 仅适用于正确的代码。构建代码时它不会编译。当您使用编译时,这意味着在构建项目时,lib 代码也会在您的项目中构建。现在,当您在运行时遇到错误时,代码存在但依赖库不存在。希望你现在已经清楚了。
-
@WarrenFaith 哦,已经一年了。现在我确切地知道为什么 - 当您的项目具有使用实现包含依赖项 B 的依赖项 A 时,您的项目将看不到依赖项 B。但是由于我已经通过在线存储库包含了依赖项 A,所以您项目的 gradle 不知道依赖项 A 正在请求依赖项 B。因此,如果您从项目中请求依赖项 B,它将解决;但最好的方法是在您的库中使用
api而不是implementation。简而言之,imo,每个模块都应该使用api。只有顶级项目应该使用implementation。
标签: android android-studio gradle android-gradle-plugin dependencies