Updating Firebase SKDs caused error: java.lang.NoClassDefFoundError:
Updating Firebase SKDs caused error: java.lang.NoClassDefFoundError:
我的应用程序运行正常。
我将所有播放服务更新到 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.access00(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]]
我看到了 问题,但那里提供的答案并没有解决我的错误。
有人知道是什么原因造成的吗?
错误提到了 Jackson ObjectMapper。新的 Firebase Database 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 SDK 后,我需要应用插件 'com.google.gms.google-services'
但是因为我已经在编译 'com.google.android.gms:play-services:version'
这导致了某种冲突,并通过从我的应用程序中删除已编译的播放服务库 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 文件到项目并更新到 google play services to 9.0.0
此更新导致 java.lang.NoClassDefFoundError 被 Facebook Rebound 库和旧的 Firebase SDK 抛出。
我的项目是一个 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。
我的应用程序运行正常。
我将所有播放服务更新到 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.access00(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]]
我看到了
有人知道是什么原因造成的吗?
错误提到了 Jackson ObjectMapper。新的 Firebase Database 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 SDK 后,我需要应用插件 'com.google.gms.google-services'
但是因为我已经在编译 'com.google.android.gms:play-services:version'
这导致了某种冲突,并通过从我的应用程序中删除已编译的播放服务库 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 文件到项目并更新到 google play services to 9.0.0
此更新导致 java.lang.NoClassDefFoundError 被 Facebook Rebound 库和旧的 Firebase SDK 抛出。
我的项目是一个 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。