2016-04-15 16 views
2

Ich versuche, eine Mac OS X-Anwendung von Java Desktops.jar, wo meine Anwendung .jar-Datei mit derby eingebetteten Datenbank APPDATA erstellen. Es schafft Problem, wenn ich createing eine Mac OS X-Anwendung .appDerby eingebettete Datenbank 'APPDATA' Ordner nicht gefunden, Versuchen OS X-Anwendung zu erstellen .app

Hier ist meine Verbindungsmethode auf Java (arbeitet bereits an .exe und Setup-Windows-& Linux)

public static Connection getdataconnet() { 
     Connection connect = null; 
     try { 
      Class.forName("org.apache.derby.jdbc.EmbeddedDriver"); 
      connect = DriverManager.getConnection("jdbc:derby:APPDATA", "xxxx", "xxxxxxxxxxxxxxx"); 
     } catch (ClassNotFoundException ex) { 
      globalData.GlobalDataSetGet.OLD_USER = -1; 
      ////JOptionPane.showMessageDialog(null, "1"+ex); 
     } catch (SQLException ex) { 
      globalData.GlobalDataSetGet.OLD_USER = -1; 
      ////JOptionPane.showMessageDialog(null, "2"+ex); 
     } 
     return connect; 
    } 

Mac OS X Anwendungsarchitektur .app enter image description here

APPDATA nicht von .jar gefunden, nachdem eine Mac OS X-Anwendung .app Erstellen CWD

Mit ..

Connection connect = null; 
    Path currentRelativePath = Paths.get(""); 
    String s = currentRelativePath.toAbsolutePath().toString(); 
    try {//DriverManager.getConnection("jdbc:derby:"+System.getProperty("user.dir")+"/APPDATA", "#####", "#############"); 
     connect = DriverManager.getConnection("jdbc:derby:"+s+"/APPDATA", "#####", "#############"); 

    } catch (ClassNotFoundException ex) { 
     globalData.GlobalDataSetGet.OLD_USER = -1; 
     JOptionPane.showMessageDialog(null, "1"+ex); 
    } catch (SQLException ex) { 
     globalData.GlobalDataSetGet.OLD_USER = -1; 
     JOptionPane.showMessageDialog(null, "2"+ex); 
    } 

enter image description here dev Hilfe benötigen, Dank!

Antwort

1

Die JDBC-Verbindungs-URL jdbc:derby:APPDATA besagt, dass Sie im aktuellen Arbeitsverzeichnis (CWD) Ihrer Anwendung nach dem Ordner mit dem Namen APPDATA suchen.

Sie müssen herausfinden, was Ihre CWD ist, wenn Ihre App gestartet wird, vielleicht auf diese Frage an den Antworten zu suchen: Getting the Current Working Directory in Java

Dann entweder

  1. ordnen Sie Ihre CWD der Ort sein, machen Wo APPDATA gespeichert ist, oder
  2. können Sie dem Benutzer erlauben, Ihrer App mitzuteilen, wo APPDATA gespeichert ist, und diesen in Ihre JDBC-Verbindungs-URL eingeben.
+1

Verbindung connect = null; Pfad currentRelativePath = Paths.get (""); Zeichenfolge s = currentRelativePath.toAbsolutePath(). ToString(); versuchen { Class.forName ("org.apache.derby.jdbc.EmbeddedDriver"); connect = DriverManager.getConnection ("jdbc: derby:" + s + "/ APPDATA", "xxx", "lxxxxx"); } // Ich benutze diese CWD, aber immer noch nicht funktioniert .. –

+1

Sehr geehrter Herr, Es ist eine gute Idee, dynamische CWD zu definieren, aber es immer noch Problem, wenn ich versuche, auf meine 'abc.app' zuzugreifen. –

+0

Direkt vor dem 'DriverManager.getConnection'-Aufruf, drucken Sie" s "aus, wie in:' System.out.println (s); '.Überprüfen Sie dann, ob diese Zeichenfolge tatsächlich auf den Ordner verweist, in dem APPDATA gespeichert ist. Wenn nicht, muss es. –

3

Wie in meiner Antwort erwähnt here,
In Mac OSX App, die Lage der aktuellen Arbeitsverzeichnis von Glas können mit

System.getProperty("java.library.path") 

Daher erhalten werden, zum Verbindungszeichenfolge, Verwendung:

String pwd = System.getProperty("java.library.path"); 
connect = DriverManager.getConnection("jdbc:derby:"+pwd+"/APPDATA", "#####", "#############"); 



Da ich gerade keinen Zugriff auf Mac habe, überprüfe nur, ob v alue von pwd endet mit '/'. Wenn ja, fügen Sie "APPDATA" anstelle von "/ APPDATA" an.
Hoffe, das hilft!