2011-12-04 3 views
9

Nello sviluppo PHP, è possibile determinare se l'app è in esecuzione o meno in una produzione o in un ambiente di sviluppo dalla variabile 'ambiente' del server.Ambienti di produzione/dev Tomcat

Esiste una variabile simile disponibile sui server tomcat oppure esiste un modo migliore di indirizzare le applicazioni per la produzione e lo sviluppo?

risposta

0

È possibile impostare le variabili di ambiente del sistema operativo in script di avvio di tomcat (ad esempio, run.sh in ambiente Linux) e leggerle dal programma. Inoltre è possibile impostare variabili di ambiente java (come questo: Passing environment variables to a JVM, in a platform-independent manner). Personalmente uso file di proprietà differenti per dev/prod/etc e leggo questa variabile per il file di proprietà. Viene distribuito solo il file delle proprietà richiesto.

2

Non è possibile eseguire questa operazione per impostazione predefinita. In ogni caso, non si basano sul contenitore per determinare ogni volta che l'applicazione è in ambiente X. direi che si dovrebbe farlo utilizzando uno dei seguenti metodi (in ordine di preferenza):

  1. Usa qualunque sia il tuo strumento di costruzione. E.g .: usa i profili di Maven. http://maven.apache.org/guides/introduction/introduction-to-profiles.html
  2. Utilizzare un file di proprietà per l'app con una proprietà "modalità".
  3. passare una -Dmyproject.mode = proprietà XXXX alla JVM
  4. utilizzare una proprietà del sistema operativo

Vi incoraggio a usare qualcosa come # 1. Sicuramente stai usando qualche tipo di strumento per costruire la tua app (Ant, SBT, ecc.).

Immagina se per errore qualcuno reinstalli Tomcat, rimuovi le proprietà del sistema operativo o simili. La tua app potrebbe essere eseguita in modalità prod.

6

Ogni istanza Tomcat di cui si dispone ha un flag isProduction definito nella sezione GlobalNamingResources del file server.xml.

server.xml:

<Server ...> 
    ... 
    <GlobalNamingResources> 
    <Environment name="isProduction" value="false" type="java.lang.Boolean" override="false" /> 
    </GlobalNamingResources> 

    <Service name="Catalina"> 
    ... etc ... 
    </Service> 
</Server> 

In questo modo la proprietà di essere disponibili in tutta l'applicazione con la creazione di una proprietà nella context.xml che fa riferimento la risorsa:

context.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<Context ...> 
    <ResourceLink name="isProduction" global="isProduction" type="java.lang.Boolean" /> 
    ... 
</Context> 

Per recuperare il valore:

public boolean isProduction() { 
    Object o; 
    try { 
     o = (new InitialContext()).lookup("java:comp/env/isProduction"); 
    } catch (NamingException e) { 
     o = Boolean.FALSE; // assumes FALSE if the value isn't declared 
    } 
    return o == null ? Boolean.FALSE : (Boolean) o; 
}