2011-02-01 6 views
5

Tengo varios sistemas que necesitan cargar las mismas propiedades en la JVM. Puedo usar el indicador -D para cargar una propiedad a la vez, pero estoy buscando algo que cargue todas las propiedades en un archivo completo a la vez. Por ejemplo:Pasar un archivo completo a argumentos de JVM

Podría simplemente agregar --options-file = blah.properties a todos los jvms en mi red, una vez, y de ahí en adelante solo cambiar el archivo de propiedades, que podría ser un único archivo central sobre un recurso compartido de red .

Gracias,

EDIT: Cualquier argumento o comandos también debe trabajar en un entorno Windows. Por lo tanto, ningún truco de bash o scripting específico de Unix no funcionará.

Respuesta

6

Eso es más o menos como lo hacemos:

java $(tr '\n' ' ' < options_file) other args...

Aquí options_file contiene listas -Dsomething o -Xsomething valores, uno por línea. El comando tr simplemente reemplaza cada nueva línea con un espacio.

+1

No creo que esto funcione en Windows. – doug

+1

@doug: no lo hará. En Windows, necesita algo como 'for/S delim = ...', no se puede recordar, pero windows proporciona una forma de leer un archivo línea por línea; agrega estas líneas a una variable de entorno. – 9000

+0

Ok, voy a intentar esto. Gracias, – doug

3

Algunas opciones:

  1. envolver su propiedades en el archivo .jar y luego obtener sus procesos de leer ese archivo de propiedades de getClass().getResourceAsStream()
  2. Escribir un archivo por lotes para ejecutar sus procesos Java, y ninguna de las listas de forma explícita las opciones -D, o crea la línea de comando de forma dinámica.

Resuelvo este problema normalmente usando Spring (usado también por otros motivos) y PropertyPlaceholderConfigurer. Eso me permite especificar una o más ubicaciones para los archivos de propiedades y modifica la configuración de Spring in situ.

+1

getClass(). GetResourceAsStream() es algo que se hace dentro de la aplicación después de que ha comenzado, ¿verdad? Necesito que esto suceda antes de que se inicie cualquier aplicación. – doug

7

No creo que se puede hacer eso a través de la línea de comandos (sin algunos hacks golpe, tal vez), pero que sin duda puede hacer que programáticamente:

Simplemente establece una propiedad -DmyPropertiesFile=/your/properties/file.properties y después de leer que con uno de las sobrecargas Properties.load(). Después de eso, System.setProperties(yourProps) debe hacer lo que esperas.

Por supuesto, esto requiere que pueda enganchar este código lo suficientemente temprano para que sus propiedades estén disponibles cuando sea necesario (Por ejemplo, si el método main() es suyo, esto es perfecto).

+0

No creo que esto funcione porque tanto la aplicación web como la aplicación log4j necesitan acceso a las mismas variables ... – doug

0

Si utiliza Ant para iniciar el proceso de Java, la respuesta de 9000 (más su comentario de Windows) funcionará, y puede hacer que el iniciador se ocupe de la diferencia del sistema operativo.

Hay un hilo StackOverflow here que describe cómo determinar el sistema operativo de la hormiga

Cuestiones relacionadas