java.lang.NoSuchMethodError 通过 admin SDK 初始化 firebase 时 Java
java.lang.NoSuchMethodError when initialising firebase through admin SDK Java
我正在尝试通过 firebase admin SDK 连接到 firestore。但是,当我打电话时:
FirebaseOptions options = new FirebaseOptions.Builder()
.setCredentials(GoogleCredentials.fromStream(serviceAccount))
.build();
FirebaseApp.initializeApp(options);
我得到以下异常:java.lang.NoSuchMethodError: 'void com.google.common.base.Preconditions.checkArgument(boolean, java.lang.String, java.lang.Object)'
我只在 运行 通过 jar 文件的程序时得到这个异常,当通过 NetBeans 编译时它运行良好。我在网上看了看,这似乎是 firebase admin SDK 版本的问题,但我不确定要使用哪个版本,并且尝试了多个版本,但都出现了同样的错误。
可能是我在 jar 文件中捆绑依赖项的方式有误?
这是我的 build.gradle 文件:
apply plugin: 'java'
apply plugin: 'jacoco'
apply plugin: 'application'
mainClassName = 'QMPAngola.Main'
repositories {
jcenter()
}
dependencies {
compile 'com.google.firebase:firebase-admin:5.9.0'
testCompile 'junit:junit:4.12'
}
configurations.all {
resolutionStrategy {
force 'com.google.guava:guava:30.1.1-jre'
}
}
jar {
manifest {
attributes "Main-Class": "QMPAngola.Main"
}
from { (configurations.runtime).collect {it.isDirectory() ? it : zipTree(it)} }
}
这是完整的堆栈跟踪:
Exception in thread "AWT-EventQueue-0" java.lang.NoSuchMethodError: 'void com.google.common.base.Preconditions.checkArgument(boolean, java.lang.String, java.lang.Object)'
at com.google.cloud.firestore.Query$ComparisonFilter.<init>(Query.java:137)
at com.google.cloud.firestore.Query.whereEqualTo(Query.java:423)
at com.google.cloud.firestore.Query.whereEqualTo(Query.java:401)
at QMPAngola.FirebaseUI.driverStart(FirebaseUI.java:315)
at QMPAngola.FirebaseUI.<init>(FirebaseUI.java:51)
at QMPAngola.Main.run(Main.java:36)
at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:313)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:770)
at java.desktop/java.awt.EventQueue.run(EventQueue.java:721)
at java.desktop/java.awt.EventQueue.run(EventQueue.java:715)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:740)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
根据我的理解 com.google.firebase:firebase-admin
正在使用 guava
作为依赖项。
据我了解,您通过
覆盖了对番石榴的传递依赖
configurations.all {
resolutionStrategy {
force 'com.google.guava:guava:30.1.1-jre'
}
}
版本不兼容。
我会说你应该删除那个块,或者你添加它有什么原因吗?
在无法调试的情况下,我的第一个假设是配置的可用性,'serviceAccount'
return 是否为预期格式的值?
第二个猜测是我注意到您使用的是 FirebaseApp
而不是 admin
您完全有可能为错误的凭据使用了错误的模块。
最后,可能是模块版本不匹配,比如FirebaseCore被安装在较新的版本中等
我正在尝试通过 firebase admin SDK 连接到 firestore。但是,当我打电话时:
FirebaseOptions options = new FirebaseOptions.Builder()
.setCredentials(GoogleCredentials.fromStream(serviceAccount))
.build();
FirebaseApp.initializeApp(options);
我得到以下异常:java.lang.NoSuchMethodError: 'void com.google.common.base.Preconditions.checkArgument(boolean, java.lang.String, java.lang.Object)'
我只在 运行 通过 jar 文件的程序时得到这个异常,当通过 NetBeans 编译时它运行良好。我在网上看了看,这似乎是 firebase admin SDK 版本的问题,但我不确定要使用哪个版本,并且尝试了多个版本,但都出现了同样的错误。
可能是我在 jar 文件中捆绑依赖项的方式有误?
这是我的 build.gradle 文件:
apply plugin: 'java'
apply plugin: 'jacoco'
apply plugin: 'application'
mainClassName = 'QMPAngola.Main'
repositories {
jcenter()
}
dependencies {
compile 'com.google.firebase:firebase-admin:5.9.0'
testCompile 'junit:junit:4.12'
}
configurations.all {
resolutionStrategy {
force 'com.google.guava:guava:30.1.1-jre'
}
}
jar {
manifest {
attributes "Main-Class": "QMPAngola.Main"
}
from { (configurations.runtime).collect {it.isDirectory() ? it : zipTree(it)} }
}
这是完整的堆栈跟踪:
Exception in thread "AWT-EventQueue-0" java.lang.NoSuchMethodError: 'void com.google.common.base.Preconditions.checkArgument(boolean, java.lang.String, java.lang.Object)'
at com.google.cloud.firestore.Query$ComparisonFilter.<init>(Query.java:137)
at com.google.cloud.firestore.Query.whereEqualTo(Query.java:423)
at com.google.cloud.firestore.Query.whereEqualTo(Query.java:401)
at QMPAngola.FirebaseUI.driverStart(FirebaseUI.java:315)
at QMPAngola.FirebaseUI.<init>(FirebaseUI.java:51)
at QMPAngola.Main.run(Main.java:36)
at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:313)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:770)
at java.desktop/java.awt.EventQueue.run(EventQueue.java:721)
at java.desktop/java.awt.EventQueue.run(EventQueue.java:715)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:740)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
根据我的理解 com.google.firebase:firebase-admin
正在使用 guava
作为依赖项。
据我了解,您通过
覆盖了对番石榴的传递依赖configurations.all {
resolutionStrategy {
force 'com.google.guava:guava:30.1.1-jre'
}
}
版本不兼容。
我会说你应该删除那个块,或者你添加它有什么原因吗?
在无法调试的情况下,我的第一个假设是配置的可用性,'serviceAccount'
return 是否为预期格式的值?
第二个猜测是我注意到您使用的是 FirebaseApp
而不是 admin
您完全有可能为错误的凭据使用了错误的模块。
最后,可能是模块版本不匹配,比如FirebaseCore被安装在较新的版本中等