【问题标题】:Updating Firebase SKDs caused error: java.lang.NoClassDefFoundError:更新 Firebase SKD 导致错误:java.lang.NoClassDefFoundError:
【发布时间】:2016-05-21 22:03:34
【问题描述】:

我的应用程序正在运行。

我将所有播放服务更新到 9.0.0,应用了 'com.google.gms.google-services' 插件和 'com.google.gms:google-services:3.0.0' 类路径。

现在我的应用程序崩溃并抛出此错误:

/UncaughtException: java.lang.NoClassDefFoundError: Failed resolution of: Lcom/fasterxml/jackson/databind/ObjectMapper;
    at com.firebase.client.core.view.QueryParams.<clinit>(QueryParams.java:36)
    at com.firebase.client.Firebase.<init>(Firebase.java:172)
    at com.firebase.client.Firebase.<init>(Firebase.java:177)
    at com.firebase.client.Firebase.<init>(Firebase.java:155)
    at com.defaultPackage.Application.addListener(Application.java:324)
    at com.defaultPackage.Application.onCreate(Application.java:84)
    at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1012)
    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4553)
    at android.app.ActivityThread.access$1500(ActivityThread.java:151)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1364)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:135)
    at android.app.ActivityThread.main(ActivityThread.java:5254)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
 Caused by: java.lang.ClassNotFoundException: Didn't find class "com.fasterxml.jackson.databind.ObjectMapper" on path: DexPathList[[zip file "/data/app/com.defaultPackage-2/base.apk"],nativeLibraryDirectories=[/data/app/com.defaultPackage-2/lib/arm, /vendor/lib, /system/lib]]

我看到了this 问题,但那里提供的答案并没有解决我的错误。

有谁知道是什么原因造成的?

【问题讨论】:

  • 您使用的是哪个版本的 Firebase Android SDK?你能分享你所有的依赖吗? Firebase SDK 9.0.0 不再依赖于 Jackson,因此如果您正确使用新的 SDK,您应该看不到任何对 Jackson 类的引用。
  • 这听起来像是一个好的答案的开始@hatboysam :-)
  • @FrankvanPuffelen 最后我发现这个错误是由于我在应用程序级别 build.gradle 中设置不同 productFlavours 的方式而引发的。我已经详细说明了我为阻止答案中引发的错误所做的工作

标签: android firebase noclassdeffounderror firebase-realtime-database objectmapper


【解决方案1】:

错误提到了 Jackson ObjectMapper。新的 Firebase 数据库 Android SDK 根本不依赖于 Jackson,因此您的错误意味着您使用的是 'com.firebase:firebase-client-android' 的某个版本。

您应该从您的build.gradle 中删除该库。您要使用的库是: com.google.firebase:firebase-database:9.0.0

The migration guide 解释了进行此更改所需的代码更改。最重要的变化如下:

之前

Firebase ref = new Firebase("<URL>");

之后

DatabaseReference ref = FirebaseDatabase.getInstance.getReference();

【讨论】:

  • 感谢您的回复。停止对旧 Firebase 对象的调用会阻止此错误的发生,但是否无法安装新的 Firebase SDK 并同时继续运行旧的 Firebase SDK 代码?在迁移指南here 中,“安装新的 Firebase SDK”部分并没有说旧的 Firebase 代码在安装新的 SDK 后将不起作用
  • 您的旧代码可以运行,但我会避免进行部分迁移。如果您使用任何新的9.0.0 库,我会立即更新所有组件以避免错误。您的旧代码,如果您 100% 保持不变,应该会继续运行。
  • 感谢您的回复,但在我的情况下,将代码 100% 保持不变并不允许旧的 Firebase 代码在不抛出 java.lang.NoClassDefFoundError: 错误的情况下运行。我发现了为什么会抛出这个错误,我在下面提供了答案
【解决方案2】:

更新:

我原来的答案可以解决这个问题,但是在升级到新的 Firebase SDK 后,我需要应用插件 'com.google.gms.google-services' 但由于我已经在编译 'com.google.android.gms:play-services:version' 这导致了某种冲突,并且通过删除已编译的我的应用程序 build.gradle 中的 play-services 库问题已修复,不再需要删除我的 productFlavours

原答案:

保持 Firebase SDK 代码 100% 不变,在某些情况下,旧的 Firebase SDK 会像您更新到新的 Firebase SDK 时一样正常运行。但是,在我的情况下,尽管我的代码 100% 与抛出 java.lang.NoClassDefFoundError 相同。

问题是由于将'apply plugin: 'com.google.gms.google-services' 行应用到我的应用程序级别build.gradle、将'classpath 'com.google.gms:google-services:3.0.0' 行应用到我的项目级别build.gradle 以及将google-services 文件应用到项目并更新到google play services 以9.0.0

更新导致 Facebook Rebound 库和旧 Firebase SDK 抛出 java.lang.NoClassDefFoundError。

我的项目是一个 multidex 项目,在我的应用程序级别 build.gradle 中我有以下几行:

 productFlavors {
        // Define separate dev and prod product flavors.
        dev {
            // dev utilizes minSDKVersion = 21 to allow the Android gradle plugin
            // to pre-dex each module and produce an APK that can be tested on
            // Android Lollipop without time consuming dex merging processes.
            minSdkVersion 21
        }
        prod {
            // The actual minSdkVersion for the application.
            minSdkVersion 14
        }
    }

通过注释掉或删除这些行,旧的 Firebase SDK 或 Facebook Rebound 库不再抛出 java.lang.NoClassDefFoundError。

【讨论】:

    猜你喜欢
    • 2018-10-18
    • 2013-06-12
    • 2013-11-09
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    相关资源
    最近更新 更多