2012-02-05 8 views
18

devo semplice progetto Java con la struttura:Confuso circa la posizione del file java proprietà

package com.abc: a.java b.java c.properties

ho parametri di configurazione del database configurato nel file di c.properties. il file All'interno proprietà a.java e b.java, mi carico con:

Properties p = new Properties(); 
InputStream in = this.getClass().getResourceAsStream("c.properties"); 
p.load(in); 

Questo funziona bene. Ma la domanda principale è che, una volta preparato il jar eseguibile esportando questo codice, anche il file delle proprietà viene impacchettato nel file jar. Se qualcun altro desidera modificare il file delle proprietà per la configurazione di un database diverso, come può farlo? Devo memorizzare il file delle proprietà in qualche posizione fissa nel computer locale. per esempio. "C: /". Quindi consegna il vaso insieme al file delle proprietà all'altra persona. Quindi ha bisogno di copiare il file delle proprietà in C:/posizione? Un'altra domanda, come posso rendere questa posizione generica per Windows e Linux?

+0

possibile duplicato di [Carica file esterno al barattolo di distribuzione] (http://stackoverflow.com/questions/9142571/load-files-external-to-the-distribution-jar) –

risposta

21

Il modo tipico di gestirlo è caricare le proprietà di base dal file incorporato e consentire agli utenti dell'applicazione di specificare un file aggiuntivo con sostituzioni. Alcuni pseudocodice:

Properties p = new Properties(); 
InputStream in = this.getClass().getResourceAsStream("c.properties"); 
p.load(in); 

String externalFileName = System.getProperty("app.properties"); 
InputStream fin = new FileInputStream(new File(externalFileName)); 
p.load(fin); 

Il vostro programma sarebbe invocata simile a questo:

java -jar app.jar -Dapp.properties="/path/to/custom/app.properties" 
+0

Questa sembra la soluzione perfetta . Lo proverò sicuramente. Grazie. – user613114

+0

Si potrebbe anche consentire all'utente di inserire un file con lo stesso nome e percorso del file jar in una directory che si trova anche nel classpath, prima del jar. In questo caso, il file dalla directory sostituirà il file nel file jar. –

2

Perché non passare la posizione del file delle proprietà come argomento della riga di comando (dopo un flag)? se non è presente, usa quello predefinito nel file jar.

-1

si sta caricando il file delle proprietà dal percorso della classe. Io suggerirei qualcosa di simile:

Properties location

3

Prima mantenere le proprietà di default nelle proprietà del file, che viene confezionato in barattolo. Quando l'applicazione si avvia, prova a leggere lo stesso file di proprietà con nome da qualche posizione predefinita nel filesystem, preferibilmente la cartella home dell'utente che puoi ottenere tramite System.getProperty("user.home");. Se il file esiste nel filesystem, caricarlo, se non esiste, caricare il file di proprietà compresso e scrivere una copia nel filesystem.

Quindi, se il nome del file delle proprietà è myprops.properties, inizialmente solo il file jar lo conterrà. All'avvio dell'applicazione controllerà se il file /home/xyz/myprops.properties esiste. Poiché non lo fa, leggerà il file delle proprietà compresso e ne scriverà una copia nel file /home/xyz/myprops.properties. Da quel momento in poi, leggerà da /home/xyz/myprops.properties.

+0

E tutte le modifiche apportate dall'utente devono essere scritte nel file /home/xyz/myprops.properties –