更新Firebase SKD导致错误:java.lang.NoClassDefFoundError:

时间:2016-05-21 22:03:35

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

我的应用正在运行。

我将所有播放服务更新为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问题但是那里提供的答案并没有为我解决错误。

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

2 个答案:

答案 0 :(得分:3)

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

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

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

<强> BEFORE

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

<强> AFTER

DatabaseReference ref = FirebaseDatabase.getInstance.getReference();

答案 1 :(得分:0)

更新:

我的原始答案可以解决问题,但在升级到新的Firebase SDK时,我需要应用插件'com.google.gms.google-services',但由于我已经在编译'com.google.android.gms:play-services:version',这会导致某种冲突,并且通过从我的app build.gradle中删除已编译的播放服务库,问题得到解决,我的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文件应用到项目并更新为谷歌播放服务到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。