2013-05-19 10 views
7

Ich habe eine kleine Anwendung geschrieben. Ich habe die datenbankspezifischen Informationen in eine Eigenschaftendatei geschrieben.Include Eine Eigenschaftendatei mit einer Jar-Datei

db.url=jdbc:mysql://localhost:3306/librarydb 
db.user=root 
db.passwd=pas$w0rd 

Wenn ich die Anwendung zum Abrufen der ausführbaren JAR-Datei erstellen, wird die Eigenschaftendatei in enthalten. Der gesamte Zweck des Einfügens dieser Informationen in eine Eigenschaftendatei besteht darin, dem Benutzer zu ermöglichen, diese zu ändern, aber dies macht es unmöglich.

Wie kann ich eine Eigenschaftendatei mit der JAR-Datei nicht darin enthalten? Ein bisschen wie Sie mit AppSettings-Datei in .NET-Anwendungen tun.

Ich bin sehr neu in Java, also würde ich mich freuen, wenn Sie es auf eine Reihe von Schritten brechen könnten.

Vielen Dank.

EDIT:

Dies ist, wie ich die Werte immer von den Eigenschaften in meinem Programm einreichen.

public class DatabaseHandler { 

    public static Connection connectToDb() { 
     Connection con = null; 
     Properties props = new Properties(); 
     InputStream in = null; 

     try { 
      in = DatabaseHandler.class.getResourceAsStream("database.properties"); 
      props.load(in); 
      in.close(); 

      String url = props.getProperty("db.url"); 
      String user = props.getProperty("db.user"); 
      String password = props.getProperty("db.passwd"); 

      con = DriverManager.getConnection(url, user, password); 
     } catch (Exception ex) {   
      Logger.getLogger(DatabaseHandler.class.getName()).log(Level.SEVERE, null, ex); 
     } 
      return con; 
    } 

} 
+0

Es ist mir nicht klar, was Sie unter „Wie kann ich gehören eine Properties-Datei mit der JAR-Datei nicht in it“ - einfach nicht setze die Eigenschaftendatei in die JAR-Datei ... –

+0

Ähm ... das nächste Beispiel, das ich geben kann, ist die Datei 'App.config' in .NET. Wenn die ausführbare Datei erstellt wird, ist die Datei damit gebündelt, richtig? Nicht _inside_ es. – Isuru

+0

Sicher. Jetzt haben Sie den Code bereitgestellt, wir können sehen, was Sie tun müssen - verwenden Sie einfach einen 'FileInputStream' anstelle von' getResourceAsStream'. –

Antwort

0

Den Speicherort der Eigenschaftendatei nicht fest codieren. Ihr Ansatz sollte sein, die Datei aus dem Klassenpfad zu streamen.

Wenn nicht, wäre der bessere Weg, auf eine URL zu zeigen, die die Eigenschafteninformationen in einem bestimmten Datenformat (sagen wir JSON) zurückgibt.

Wenn Sie JAR überprüfen this aus.

Wenn Ihre Anwendung WAR ist, überprüfen Sie properties in WAR.

2

Sie können stattdessen eine Eigenschaftendatei aus dem Klassenpfad laden. Dies ermöglicht es Ihnen, die Eigenschaftendatei innerhalb des Jars zu bündeln, aber auch außerhalb der Jar. Es muss nur auf dem Klassenpfad der laufenden Anwendung sein.

können Sie dies auf folgende Weise:

Properties props = new Properties(); 
InputStream inputStream = this.getClass().getClassLoader() 
     .getResourceAsStream(propFileName); 

props.load(inputStream); 
+0

Also, wenn ich nur die Eigenschaften-Datei in den gleichen Ordner, wo die ausführbare JAR-Datei ist, würde es funktionieren? (Ich habe auch die Frage bearbeitet, um den Code zu setzen, den ich verwende, um die Werte aus der Eigenschaftendatei abzurufen.) – Isuru

6

Sie richtig sind. Wenn die Eigenschaften bestimmt sind, durch den Anwender modifizierbar sein, dann sie in einem Eigenschaft setzt in der JAR-Datei wird nicht

Es gibt ein paar Ansätze arbeiten:

  • Sie die Eigenschaften setzen könnten in einer Eigenschaftendatei, die Sie im Dateisystem speichern. Das Problem ist, herauszufinden, wo im Dateisystem sie speichern:

    • Unter UNIX/Linux gibt es Konventionen für wo speichern systemweiten und benutzerspezifischen Konfigurationseigenschaften, aber diese sind ein bisschen locker, und in einem Zustand des Flusses (zB bestimmte "Desktop" -Frameworks haben ihre eigenen Präferenzmechanismen.

    • Es gibt ähnliche Konventionen für Windows glaube ich.

    • Das Problem mit der Vorgehensweise können Probleme mit Berechtigungen sein (Sie möchten nicht, dass ein Benutzer die Einstellungen eines anderen ändert) und möglicherweise sogar Probleme mit schreibgeschützten Dateisystemen und dergleichen.

    • Wenn Sie eine Eigenschaftendatei im Dateisystem verwenden, ist es eine schlechte Idee, den Speicherort in Ihrem Code fest zu verdrahten. Konfigurieren Sie es über ein Befehlszeilenargument und/oder eine "Systemeigenschaft", die mit der Option -D festgelegt werden kann.

  • Unter Windows können Sie die Eigenschaften in die Windows-Registrierung einfügen. Aber Sie müssen dazu Bibliotheken von Drittanbietern verwenden. Und natürlich das ist nicht tragbar - es wird nicht auf einer Nicht-Windows-Plattform funktionieren.

  • Sie könnten die Java Preferences API verwenden. Dies ist portabel über mehrere Plattformen hinweg, aber es ist eine Java-zentrierte Lösung; es passt nicht gut zu dem "normalen" Weg der Plattform, Dinge zu tun.

Kurz gesagt, es gibt keine Lösung, die aus allen Perspektiven ideal ist.


Aber sobald Sie sich entschieden haben, wie Sie Ihre Einstellungen zu speichern, Sie könnte Ihre Anwendung schreiben, so dass es die Eigenschaften verwendet in Ihrer JAR-Datei Datei Standard oder Anfangseinstellungen zu liefern.

2

statt

in = DatabaseHandler.class.getResourceAsStream("database.properties"); 

versuchen

in = DatabaseHandler.class.getResourceAsStream("/database.properties");