Come variare costanti sulla base di un'istanza distribuzione
-
18-09-2019 - |
Domanda
Ho costruito un GWT 1.7 applicazione + GAE utilizzando il plug-in di Eclipse. Le costanti di sistema vengono caricati in un file MyConstants.properties che viene caricato dalla classe MyConstants Singleton estendendo la classe di ... gwt.i18n.client.Constants.
Vorrei per MyConstants per caricare uno dei diversi file contenenti le impostazioni come
- MyConstants-local.properties
- MyConstants-alpha.properties
- MyConstants-beta.properties
- MyConstants-prod.properties
Ho trovato diversi riferimenti di Guice Enum stage, ma questo non sembra essere supportata da gin. Inoltre, gestisce solo dev / prod e ho sicuramente bisogno di una beta / soluzione locale / prod.
C'è un modo per farlo utilizzando un'arg riga di comando o di qualche altro esempio parametro di runtime definito che funzionerà quando caricati su GAE?
Soluzione
Sul lato server GAE, sono stato in grado di distinguere il mio ambiente dev da qualsiasi ambiente di produzione schierato con questi pezzi di codice.
Create un'unica interfaccia e due file di classe.
public interface MyConstants {
public String myConstant();
}
public class MyConstantsDev implements MyConstants {
public String myConstant() { return "xyzzy-dev"; };
}
public class MyConstantsProd implements MyConstants {
public String myConstant() { return "xyzzy-prod"; };
}
Definire un po 'di magia Guice vincolante utilizzando il "user.dir" env var. L'ultima directory all'interno del percorso user.dir è o l'unico Google App Engine Application Identifier o la vostra directory di sviluppo del progetto principale. Una volta che sai questo, è possibile determinare quale insieme di costanti da utilizzare.
public class MyServerModule extends com.google.inject.AbstractModule {
String appIdentifier = new File( System.getProperty("user.dir") ).getName();
if ( appIdentifier.equals("trunk") ) {
// Load MyConstants-dev.properties
bind( MyConstants.class ).to( MyConstantsDev.class ).in(Singleton.class);
} else {
// Load MyConstants-prod.properties
bind( MyConstants.class ).to( MyConstantsProd.class ).in(Singleton.class);
}
}
Questo mi permette di iniettare costanti dev / prod in classi come questo:
public class MyDomainClass {
@Inject
public MyDomainClass( Logger logger, MyConstants const ) {
logger.debug( const.myConstant() );
};
}
Altri suggerimenti
Si dovrebbe utilizzare l'interfaccia type-safe particolarmente è fatto per lavorare questo fuori ...
if (SystemProperty.environment.value() == SystemProperty.Environment.Value.Production)
{
//It's production.
}
else
{
//It's Dev - and (SystemProperty.environment.value() == SystemProperty.Environment.Value.Development)
}
Una cosa che è diversa tra lo sviluppo e l'ambiente distribuito è la variabile d'ambiente SERVER_SOFTWARE
:
if (System.getenv("SERVER_SOFTWARE").startsWith("Dev")) {
// Load MyConstants-dev.properties
} else {
// Load MyConstants-prod.properties
}
Forse si può scegliere quale modulo Guice a carico in base fuori di questo.
Sulla risposta di cui sopra per ottenere il GAE SERVER_SOFTWARE variabile; La variabile di ambiente SERVER_SOFTWARE è un valore predefinito CGI quindi la sua un ambiente server web e non è accessibile attraverso i Vars ambiente di sistema, ma è disponibile dal ServletContext.
Ecco il codice che dovrebbe ottenere il valore vostro bisogno (Nessuna idea perché la sua ServerInfo e non ServerSoftware ...):
if (getServletContext().getServerInfo().startsWith("Dev")) {
// Load MyConstants-dev.properties
} else {
// Load MyConstants-prod.properties
}