【问题标题】:Firebase Admin SDK can't connect to Database from inside jar fileFirebase Admin SDK 无法从内部 jar 文件连接到数据库
【发布时间】:2017-10-11 17:20:58
【问题描述】:

我正在使用 Firebase 开发一个 Android 应用程序,我决定使用 Firebase Admin SDK 创建一个简单的管理应用程序。使用 IDE (IntelliJ IDEA) 启动并通过 Admin SDK 连接到数据库工作正常,但是在启动导出的 .jar 文件时,Admin SDK 无法连接到数据库。为了初始化与 Firebase 的连接,我使用以下 (Kotlin) 代码:

//Initialize the Firebase Admin SDK.
val serviceAccount = 
this.javaClass.classLoader.getResourceAsStream("fen/ftcConsole/control/flip-the-classroom-app-firebase-adminsdk.json")
    val options = FirebaseOptions.Builder()
        .setCredential(FirebaseCredentials.fromCertificate(serviceAccount))
        .setDatabaseUrl("https://flip-the-classroom-app.firebaseio.com/")
        .setStorageBucket("flip-the-classroom-app.appspot.com")
        .build()
FirebaseApp.initializeApp(options)

//Get the connections to the database and the cloud storage.
database = FirebaseDatabase.getInstance()
storage = StorageClient.getInstance().bucket()

我添加了一些控制台输出,发现代码没有超过这一行:“database = FirebaseDatabase.getInstance()”。它只是阻塞线程,没有任何反应。也不抛出异常。 正如我所说,这只发生在导出的 jar 文件中,当使用 IDE 启动时,一切正常,这使得测试非常困难。

使用 IntelliJ 和 gradle 创建 .jar 文件,将依赖项打包在 .jar 文件中以及将它们留在外部,使用 .jar 文件内部或外部的 admin-key 加载 .json 文件,问题总是出现。

为了使用 gradle 创建 .jar,build.gradle 文件包含以下 jar 块:

jar {
   manifest {
       attributes 'Main-Class': 'fen.ftcConsole.gui.GUIStarterKt'
   }
   //adding project files/resources to the jar file
   from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
}

“gradle jar”为我提供了一个 .jar 文件,其中所有依赖项和资源都正确放入文件中。该应用程序还包含一个可以正确启动的 JavaFX GUI。只有 Firebase 连接不起作用。当我使用应用程序插件而不是“gradle jar”时也会发生同样的情况。

【问题讨论】:

  • 你究竟在做什么来导出这个 jar?
  • 我用 jar 文件的 build.gradle 内容更新了问题。如前所述,一切正常,除了 Admin SDK 数据库连接。
  • 您是否考虑过使用 Gradle 的应用程序插件来管理这个? docs.gradle.org/current/userguide/application_plugin.html
  • 感谢您的回复,我刚刚尝试了应用程序插件,但不幸的是它给了我相同的结果。它编译成功,启动,但没有通过与数​​据库的连接。
  • 这可能是一个凭证问题。确保打包到 jar 中的凭据是正确的,并且可以访问数据库。您还可以启用调试日志以查看发生了什么(使用 SLF4J 或尝试 setLogLevel() 方法)。

标签: java firebase jar kotlin firebase-admin


【解决方案1】:

Deprecated类:

Firebase 凭据

...

这个类已被弃用。使用 GoogleCredentials。

来自快速入门example

    public static void main(String[] args) {
        // Initialize Firebase
        try {
            // [START initialize]
            FileInputStream serviceAccount = new FileInputStream("service-account.json");
            FirebaseOptions options = new FirebaseOptions.Builder()
                    .setCredentials(GoogleCredentials.fromStream(serviceAccount))
                    .setDatabaseUrl(DATABASE_URL)
                    .build();
            FirebaseApp.initializeApp(options);
            // [END initialize]
        } catch (IOException e) {
            System.out.println("ERROR: invalid service account credentials. See README.");
            System.out.println(e.getMessage());

            System.exit(1);
        }

        // Shared Database reference
        database = FirebaseDatabase.getInstance().getReference();

        // Start listening to the Database
        startListeners();

        // Kick off weekly email task
        startWeeklyTopPostEmailer();
}

改用GoogleCredentials

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-16
    • 2021-01-29
    • 2019-12-27
    • 2020-01-31
    • 2013-05-28
    • 2020-03-13
    • 2018-12-05
    • 1970-01-01
    相关资源
    最近更新 更多