Firebase Admin SDK无法从jar文件中连接到数据库

时间:2017-10-11 17:20:58

标签: java firebase jar kotlin firebase-admin

我正在使用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文件中并将它们放在外面,使用admin-key从.jar文件或外部加载.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"。

时,会发生同样的情况

1 个答案:

答案 0 :(得分:0)

Deprecated上课:

  

FirebaseCredentials

     

...

     

此类已弃用。使用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