Ecco alcune pratiche possibili che ho utilizzato o incontrato. La combinazione di questi è solitamente necessaria nella pratica.
Sostituendo i valori delle variabili in conffiles quando si costruisce
Ecco un esempio di come questo può essere fatto con Apache Ant. proprietà Ant (${var.name}
) possono essere controllati con i file di configurazione di generazione:
<filterset id="variables.to.replace">
<filter token="APPNAME" value="${app.name}"/>
<filter token="WEBAPP-PATH" value="${webapp.path}"/>
<filter token="ENCRYPT-ALGORITHM" value="${encrypt.algorithm}"/>
<filter token="ERROR-MAILTO" value="${error.mailTo}"/>
<!--...-->
</filterset>
<!-- Then, when building & copying the conf, replace the variables: -->
<copy todir="${properties.target.dir}">
<!-- env specific conf files -->
<fileset dir="${basedir}/env/${run.env}/webapp/WEB-INF/classes" />
<filterset refid="variables.to.replace"/>
</copy>
La cosa buona è che si ottiene un buon controllo sulle diverse configurazioni in fase di compilazione. Ciò che è negativo è che il sistema tende a diventare molto complesso e difficile da mantenere se si utilizza questo metodo in modo estensivo per un gran numero di diverse configurazioni. Inoltre, dover costruire i conffiles significa anche rallentare i cicli di sviluppo.
Sostituendo le variabili da conf all'interno guerra al webapp all'avvio
Questo è quello che faccio di solito quando si utilizza Spring Framework, anche se v'è solo una configurazione possble, ottenere i benefici della separazione degli interessi. Con Spring, è possibile sostituire i valori di conf con PlaceholderPropertyConfigurer all'interno del contesto Spring all'avvio di webapp. In questo caso, devi comunque scegliere la configurazione corretta, che può essere configurata per esempio in fase di costruzione.
Rispetto al tempo di costruzione in sostituzione, è più semplice manipolare temporaneamente i valori in una webapp non compressa, se necessario. Ovviamente, è necessario riavviare la webapp se si modifica qualcosa e le modifiche manuali non verranno mantenute tra le ridistribuzioni di webapp. Anche Spring è limitato al contesto Spring, quindi this doesnt' work e.g. in web.xml (ma probabilmente le variabili in web.xml dovrebbero essere comunque evitate a causa dei suoi limiti).
Leggendo il conf locale da un file predefinito
Questo approccio è probabilmente il più facile da configurare: basta inventare un percorso del file di configurazione, ad esempio, $HOME/mywebapp/conf.properties
e rendi la tua webapp in qualche modo leggibile all'avvio.
La cosa buona è che non ci si deve preoccupare della conf quando si costruisce/distribuisce la webapp. Ad ogni modo, dovresti avere alcuni preregolati conf, che possono essere sovrascritti dal locale conf.
Avere la conf in un database
Questa è la soluzione più flessibile per superiori parametri conf, ma può anche complicarsi in alcuni casi. Avere il conf in una tabella con name
e value
colonne dovrebbe funzionare per la maggior parte dei casi.
Ovviamente, non è possibile configurare gli URL di connessione JDBC in una tabella di database, ma questa è una buona soluzione per un semplice conf di testo/numerico che influisce sull'operazione webapp dopo che è stata impostata la connessione db. Per evitare una penalizzazione delle prestazioni, assicurati di aver memorizzato nella cache in qualche modo il conf se verrà acceduto frequentemente.
pratiche extra
Come sottolineato da kgiannakakis, ma aiuta anche a impostare una pagina di diagnostica di configurazione di qualche tipo per la vostra applicazione.
Risposte correlate: http://stackoverflow.com/questions/1634458/can-i-use-a-single-war-file-in-multiple-environments-should-i – McDowell
JNDI (java.sun.com/ products/jndi) è stato creato appositamente per risolvere questo problema, ed è quello che uso di solito per i sistemi di produzione, dal momento che si adatta bene (funziona se ho 1 ambiente o 6). Separa chiaramente anche le responsabilità degli sviluppatori e degli amministratori di sistema. Detto questo, se sai che avrai solo 6 ambienti, e che il numero non cambierà praticamente mai, la soluzione di Jeremy dovrebbe funzionare, e credo che sia la convenzione più recente rispetto ai framework di configurazione (ad es. Grails). –
Per inciso, l'installazione di JNDI richiede la configurazione manuale, ma lo si fa solo una volta per ambiente (una specie di installazione del server dell'app o del sistema operativo dell'ambiente). –