2011-02-01 9 views
5

Ho diversi sistemi che devono tutti caricare le stesse proprietà sulla JVM. Posso usare il flag -D per caricare una proprietà alla volta, ma sto cercando qualcosa che caricherà tutte le proprietà in un intero file in una volta. Per esempio:Passaggio di un intero file agli argomenti JVM

Potrei solo aggiungere --options-file = blah.properties a tutte le JVM sulla mia rete, una volta, e da allora in poi solo cambiare il file delle proprietà, che potrebbe essere un singolo file centrale su una condivisione di rete .

Grazie,

EDIT: Qualsiasi argomento o comandi deve lavorare in un ambiente Windows. Pertanto qualsiasi hacking bash o scripting specifico per unix non funzionerà.

risposta

6

Ecco più o meno come lo facciamo:

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

Qui options_file contiene pronti -Dsomething o -Xsomething valori, uno per riga. Il comando tr sostituisce semplicemente ogni nuova riga con uno spazio.

+1

Non penso che funzionerà in Windows. – doug

+1

@doug: non lo farà. Sotto windows, hai bisogno di qualcosa come 'for/S delim = ...', non ricordo, ma windows fornisce un modo per leggere un file riga per riga; aggiungi queste linee a una variabile di ambiente. – 9000

+0

Ok, farò un tentativo. Grazie, – doug

3

Alcune opzioni:

  1. avvolgere la proprietà nel file .jar e quindi ottenere i processi di leggere che le proprietà file da getClass().getResourceAsStream()
  2. Scrivi un file batch per eseguire i processi Java, e in modo esplicito lista le opzioni -D o creare la riga di comando in modo dinamico.

Risolve questo problema normalmente utilizzando Spring (utilizzato anche per altri motivi) e uno PropertyPlaceholderConfigurer. Ciò mi consente di specificare una o più posizioni per i file delle proprietà e modificare la configurazione Spring sul posto.

+1

getClass(). GetResourceAsStream() è qualcosa che si fa all'interno della app dopo che è iniziato, giusto? Ho bisogno che questo accada prima che venga avviata qualsiasi applicazione .. – doug

7

Non credo che si può fare tramite la riga di comando (senza alcuni hack bash, forse), ma si può sicuramente fare che programmaticamente:

sufficiente impostare una proprietà -DmyPropertiesFile=/your/properties/file.properties e poi letto che con una delle i sovraccarichi Properties.load(). Dopodiché, System.setProperties(yourProps) dovrebbe fare ciò che ti aspetti.

Naturalmente, questo richiede che è possibile agganciare questo codice abbastanza presto in modo che le proprietà siano disponibili quando necessario (ad esempio, se il metodo main() è tuo, questo è perfetto).

+0

Non penso che funzionerà perché sia ​​l'applicazione web che l'applicazione log4j hanno bisogno di accedere alle stesse variabili ... – doug

0

Se si utilizza Ant per avviare il processo Java, la risposta di 9000 (più il suo commento di Windows) funzionerà, e si può avere il programma di avvio con la differenza di sistema operativo.

C'è un filo StackOverflow here che descrive come determinare il sistema operativo da formica

Problemi correlati