2017-10-11 58 views
0

我正在开发一个带有Firebase的Android应用程序,并且我已决定使用Firebase Admin SDK创建一个简单的管理应用程序。使用IDE(IntelliJ IDEA)启动并通过Admin SDK连接到数据库可以正常工作,但启动导出的.jar文件时,Admin SDK无法连接到数据库。要初始化到火力地堡的连接,我用下面(科特林)代码:Firebase Admin SDK无法从jar文件内部连接到数据库

//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() 

我增加了一些控制台输出,并发现该代码只是没有得到过去的这行:“数据库= FirebaseDatabase.getInstance ()”。它只是阻止线程而没有任何反应。也没有例外抛出。 正如我所说的,这只发生在导出的jar文件中,从IDE开始时,一切正常,这使得测试非常困难。

使用IntelliJ和gradle创建.jar文件,打包.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文件文件。该应用程序还包含可正确启动的JavaFX GUI。只有Firebase连接不起作用。当我使用应用程序插件而不是“gradle jar”时,会发生同样的情况。

+0

你究竟在做什么导出这个罐子? –

+0

我使用jar文件的build.gradle内容更新了问题。如前所述,除Admin Admin数据库连接之外,一切正常。 –

+0

您是否考虑过使用Gradle的应用程序插件来管理它? https://docs.gradle.org/current/userguide/application_plugin.html –

回答

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代替。