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?

È stato utile?

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
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top