Por lo tanto, usted quiere tratar su archivo .properties
en la misma carpeta que el principal jar/ejecutable como un archivo en lugar de como un recurso de la jar principal/ejecutable. En ese caso, mi propia solución es la siguiente:
Primero lo primero: la arquitectura de archivo de programa será así (asumiendo que su programa principal es main.jar y presentar sus principales propiedades es main.properties):
./ - the root of your program
|__ main.jar
|__ main.properties
Con esta arquitectura, puede modificar cualquier propiedad en el archivo main.properties usando cualquier editor de texto antes o mientras su main.jar se esté ejecutando (dependiendo del estado actual del programa) ya que solo está basado en texto archivo. Por ejemplo, el archivo puede contener main.properties:
app.version=1.0.0.0
app.name=Hello
Por lo tanto, cuando se ejecuta el programa principal de su carpeta raíz/base, normalmente se corre así:
java -jar ./main.jar
o, enseguida:
java -jar main.jar
en su main.jar, es necesario crear unos métodos de utilidad para todos los bienes que se encuentren en el archivo de main.properties; Digamos que la propiedad app.version
tendrá getAppVersion()
método de la siguiente manera:
/**
* 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;
}
En cualquier parte del programa principal que necesita el valor app.version
, llamamos a su método de la siguiente manera:
String version = null;
try{
version = getAppVersion();
}
catch (IOException ioe){
ioe.printStackTrace();
}
Ver [esta respuesta] (http://stackoverflow.com/a/5052359/418556) - * "En lugar de almacenar el archivo 'predeterminado' dentro del tarro. Si se cambia, almacenar el archivo alterado en otro lugar. Un lugar común es un subdirectorio de 'user.home'. Al verificar el archivo, primero verifique la existencia de un archivo alterado en el sistema de archivos, y si no existe, cargue el archivo predeterminado. "* ** BTW ** *" No quiero ... "* Lo que es menos importante que lo que funciona y es práctico. El almacenamiento de la configuración de la aplicación en el directorio de la aplicación es fuertemente desaconsejado por Oracle y MS (y probablemente otros). –
La razón por la que necesito mantener el archivo de propiedades en el directorio jar es que es mejor mantenerlos juntos cuando todo el directorio (incluidos el jar y la propiedad) se copia en otra máquina y ejecutar. – SoulMan
Y si forzo al usuario a pasar la ruta del archivo de propiedad, entonces necesita cambiarlo cada vez que ejecuta el lote archivo de una máquina diferente – SoulMan