java.lang.Ошибка noSuchMethod при инициализации firebase через Java SDK администратора

# #java #firebase #gradle #netbeans #firebase-admin

Вопрос:

Я пытаюсь подключиться к firestore через SDK администратора firebase. Однако, когда я звоню:

  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. Я читал в Интернете, и, похоже, это проблема с версиями SDK администратора firebase, но я не уверен, какую версию использовать, и пробовал несколько версий с одной и той же ошибкой.

Может быть, это ошибка в том, как я объединяю свои зависимости в файл 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$1.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$4.run(EventQueue.java:721)                                                                                                                             
        at java.desktop/java.awt.EventQueue$4.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)   
 

Ответ №1:

Насколько я понимаю com.google.firebase:firebase-admin , это использование guava в качестве зависимости.

Насколько я понимаю, вы переопределяете переходную зависимость от гуавы с помощью

 configurations.all {
    resolutionStrategy {
        force 'com.google.guava:guava:30.1.1-jre'
    }
}
 

с несовместимой версией.

Я бы сказал, что вам следует удалить этот блок, или есть какая-то причина, по которой вы его добавили?

Комментарии:

1. Я добавил его в результате получения этого исключения, потому что прочитал, что исключение может быть вызвано устаревшей зависимостью от guava, поэтому я попытался заставить его использовать последнюю версию. К сожалению, это не помогло. Я попытался запустить его после удаления этого блока, и ничего не изменилось.

Ответ №2:

Не имея возможности отлаживать, мое первое предположение было бы о доступности конфигурации, 'serviceAccount' возвращает ли значение в ожидаемом формате?

Второе предположение состоит в том, что я заметил, что вы используете FirebaseApp , а не admin вполне возможно, что вы используете неправильные модули для неправильных учетных данных.

Наконец, возможное несоответствие версий в модулях, таких как FirebaseCore, устанавливаемый в более новых версиях и т. Д.