2012-02-05 19 views
18

que tienen proyecto Java sencilla con la estructura:confundido acerca de la ubicación de Java propiedades de archivos

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

He configurado los parámetros de configuración de base de datos en el archivo c.properties. Dentro de las propiedades a.java y b.java, estoy usando la carga de archivos:

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

Esto funciona bien. Pero la pregunta principal es: una vez que preparo el archivo ejecutable exportando este código, el archivo de propiedades también se empaqueta en el archivo jar. Si alguien más quiere modificar el archivo de propiedades para una configuración de base de datos diferente, ¿cómo puede hacerlo? ¿Tengo que almacenar el archivo de propiedades en una ubicación fija en la máquina local? p.ej. "do:/". Luego, entregue el archivo jar junto con las propiedades a la otra persona. Entonces él necesita copiar el archivo de propiedades dentro de C:/location? También una pregunta más, ¿cómo puedo hacer que esta ubicación sea genérica para Windows y Linux?

+0

posible duplicado de [Cargar archivos externos a la jarra de distribución] (http://stackoverflow.com/questions/9142571/load-files-external-to-the-distribution-jar) –

Respuesta

21

La forma típica de manejar esto es cargar las propiedades base de su archivo incrustado, y permitir a los usuarios de la aplicación especificar un archivo adicional con anulaciones. Algunos pseudocódigo:

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); 

Su programa se invocaría similar a esto:

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

Esta parece ser la solución perfecta . Probablemente voy a intentar esto. Gracias. – user613114

+0

También podría permitir que el usuario coloque un archivo con el mismo nombre y ruta que en el archivo jar en un directorio que también se encuentre en el classpath, antes del jar. En este caso, el archivo del directorio reemplazaría el archivo en el archivo jar. –

2

¿Por qué no pasar la ubicación del archivo de propiedades como un argumento de línea de comando (siguiendo un indicador)? si no está presente, utilice el predeterminado en el archivo jar.

-1

va a cargar el archivo de propiedades de la ruta de clase. Me gustaría sugerir algo como esto:

Properties location

3

Primera mantener las propiedades por defecto en las propiedades de archivo, que está abarrotado en el frasco. Cuando se inicia la aplicación, intente leer un mismo archivo de propiedades con nombre desde una ubicación predeterminada en el sistema de archivos, preferible la carpeta de inicio del usuario que puede obtener por System.getProperty("user.home");. Si el archivo existe en el sistema de archivos, cárguelo, si no existe, cargue su archivo de propiedades empaquetadas y escriba una copia en el sistema de archivos.

Por lo tanto, si el nombre de su archivo de propiedades es myprops.properties, inicialmente solo su archivo jar lo contendrá. Cuando se inicia la aplicación, comprobará si existe el archivo /home/xyz/myprops.properties. Como no lo hace, leerá el archivo de propiedades empaquetadas y escribirá una copia en el archivo /home/xyz/myprops.properties. A partir de la próxima vez, leerá desde /home/xyz/myprops.properties.

+0

Y todos los cambios que el usuario realice se deben escribir en el archivo /home/xyz/myprops.properties –

Cuestiones relacionadas