Quindi, si vuole trattare il file .properties
sulla stessa cartella del vaso principale/eseguibile come un file piuttosto che come una risorsa della barattolo principale/eseguibile. In tal caso, la mia soluzione è la seguente:
Per prima cosa: l'architettura di file di programma deve essere simile a questo (supponendo che il programma principale è main.jar e il file le sue proprietà principali è main.properties):
Con questa architettura, è possibile modificare qualsiasi proprietà nel file main.properties utilizzando qualsiasi editor di testo prima o mentre il file main.jar è in esecuzione (a seconda dello stato corrente del programma) poiché si tratta solo di un testo file. Ad esempio, il file può contenere main.properties:
app.version=1.0.0.0
app.name=Hello
Così, quando si esegue il programma principale dalla sua cartella principale/base, normalmente vi imbatterete in questo modo:
java -jar ./main.jar
o, subito:
java -jar main.jar
nella tua main.jar, è necessario creare un paio di metodi di utilità per ogni proprietà trovata in file main.properties; diciamo la proprietà app.version
avrà getAppVersion()
metodo come segue:
/**
* Gets the app.version property value from
* the ./main.properties file of the base folder
*
* @return app.version string
* @throws IOException
*/
public static String getAppVersion() throws IOException{
String versionString = null;
//to load application's properties, we use this class
Properties mainProperties = new Properties();
FileInputStream file;
//the base folder is ./, the root of the main.properties file
String path = "./main.properties";
//load the file handle for main.properties
file = new FileInputStream(path);
//load all the properties from this file
mainProperties.load(file);
//we have loaded the properties, so close the file handle
file.close();
//retrieve the property we are intrested, the app.version
versionString = mainProperties.getProperty("app.version");
return versionString;
}
In ogni parte del programma principale che ha bisogno il valore app.version
, abbiamo chiamare il suo metodo come segue:
String version = null;
try{
version = getAppVersion();
}
catch (IOException ioe){
ioe.printStackTrace();
}
Vedere [questa risposta] (http://stackoverflow.com/a/5052359/418556) - * "Memorizza invece il file 'predefinito' all'interno del Jar. Se viene modificato, salva il file alterato in un altro posto. Un luogo comune è una sottodirectory di 'user.home'. Quando verifichi il file, controlla prima l'esistenza di un file alterato sul file system e, se non esiste, carica il file predefinito. "* ** BTW ** *" Non voglio ... "* Cosa vuoi il desiderio è meno importante di ciò che funziona ed è pratico. La memorizzazione delle impostazioni dell'app nella directory dell'applicazione è fortemente sconsigliata da Oracle & MS (e probabilmente da altri) –
Il motivo per cui ho bisogno di mantenere il file delle proprietà nella directory jar è che è meglio tenerli insieme quando l'intera directory (incluso jar e proprietà) viene copiata su un'altra macchina ed eseguita. – SoulMan
E se costringo l'utente a passare il percorso del file delle proprietà, allora deve cambiarlo ogni volta che esegue il batch file da una macchina diversa. – SoulMan