【问题标题】:ClassNotFoundException: Didn't find class "androidx.work.Worker" on path: DexPathListClassNotFoundException:在路径上找不到类“androidx.work.Worker”:DexPathList
【发布时间】:2019-05-28 23:38:22
【问题描述】:

我一直在尝试制作一个 android 库,当时我正在使用 WorkManager 的 PeriodicWorkRequest。它作为主机开发应用程序中的一个模块可以完美地工作。但是,一旦我将其导出为 aar 文件并在另一个应用程序中使用它,就会出现以下错误,

java.lang.NoClassDefFoundError: Failed resolution of: Landroidx/work/Worker;
.
.
.
Caused by: java.lang.ClassNotFoundException: Didn't find class "androidx.work.Worker" on path: DexPathList[[zip file "/data/app/com.example.testapp-0WusKIYjC1qsHRMASLjm1Q==/base.apk"],nativeLibraryDirectories=[/data/app/com.example.testapp-0WusKIYjC1qsHRMASLjm1Q==/lib/arm64, /system/lib64, /vendor/lib64]]

知道如何解决这个问题吗?

【问题讨论】:

    标签: android dex androidx aar


    【解决方案1】:

    AAR 本身不会嵌入或以其他方式编码有关传递依赖的任何内容(例如您的 AAR 对 WorkManager 的依赖),因此如果您只是将 AAR 用作local binary dependency 你需要重新声明所有的传递依赖。

    根据Gradle Declaring Dependencies documentation,正确的依赖关系是 maven 存储库(本地或远程)的形式。 maven 存储库,除了托管 AAR 本身,还包括一个 POM file,它声明了您的库所依赖的传递依赖项。这可确保您的构建中只包含每个库的一个版本(因为它可以消除跨多个库的传递依赖项的重复数据)。

    在本地使用项目时,您不会看到同样的问题,因为这些传递依赖项包含在构建过​​程中。

    【讨论】:

    • 这行得通。但是,我觉得很奇怪,我必须再次在应用程序 gradle 中重新声明所有 AAR 依赖项。 gradle 不能只拾取传递依赖吗?
    • AAR 本身没有任何依赖的概念——它只是一个 jar、资源和清单。这就是为什么每个受人尊敬的库不只是作为你下载到本地目录的 AAR 发布,而是作为具有传递依赖关系概念的 Maven 依赖关系发布的原因。
    【解决方案2】:

    你有一个依赖错误,你正在尝试使用你的库的应用程序使用 androidx 支持库,尝试将 WorkManager's 依赖更改为 androidx 依赖

    【讨论】:

    • 我已经为 WorkManager 添加了 androidx 依赖。请参考@ianhanniballake 的回答,它为我解决了这个问题。
    • 太好了,你解决了问题
    • 是的。无论如何,感谢您的投入。
    • 不客气,如果有帮助可以点赞,也许对这里的其他人有帮助
    猜你喜欢
    • 2015-07-01
    • 2017-10-21
    • 2018-11-20
    • 1970-01-01
    • 1970-01-01
    • 2018-05-28
    • 1970-01-01
    • 2016-02-04
    • 2017-09-12
    相关资源
    最近更新 更多