Pregunta

He estado construyendo una aplicación 1.7 + GAE GWT usando el plugin eclipse. Las constantes del sistema se cargan en un archivo MyConstants.properties que se carga por la clase MyConstants singleton extender la clase ... gwt.i18n.client.Constants.

Me gustaría que MyConstants para cargar uno de los varios archivos que contienen ajustes como

  • MyConstants-local.properties
  • MyConstants-alpha.properties
  • MyConstants-beta.properties
  • MyConstants-prod.properties

He encontrado varias referencias a la etapa de enumeración de Guice, pero esto no parece ser apoyado por la ginebra. Además, sólo se ocupa dev / prod y que sin duda necesita una solución local / beta / prod.

¿Hay una manera de hacer esto utilizando una línea de comandos o arg algún parámetro de tiempo de ejecución se define otra instancia que funcionará cuando se carga en GAE?

¿Fue útil?

Solución

En el lado del servidor GAE, yo era capaz de distinguir mi entorno de desarrollo de cualquier entorno de producción desplegado con estas piezas de código.

Crea una interfaz y dos archivos de clase.

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"; };
}

Definir un poco de magia Guice unión usando el "user.dir" env var. El último directorio dentro de la trayectoria user.dir es o bien la única Google App Engine identificador de la aplicación o el directorio raíz de desarrollo del proyecto. Una vez que sepas esto, se puede determinar qué conjunto de constantes para su uso.

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);
 }
}

Esto me permite inyectar constantes dev / prod en clases como esta:

public class MyDomainClass {

 @Inject
 public MyDomainClass( Logger logger, MyConstants const ) { 
  logger.debug( const.myConstant() ); 
 };
}

Otros consejos

Se debe utilizar la interfaz de tipo seguro, especialmente hecho para resolver esto ...

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 que es diferente entre el desarrollo y el entorno implementado es la variable de entorno SERVER_SOFTWARE:

if (System.getenv("SERVER_SOFTWARE").startsWith("Dev")) {
  // Load MyConstants-dev.properties
} else {
  // Load MyConstants-prod.properties
}

Tal vez se puede elegir qué módulo Guice para cargar basa fuera de eso.

En la respuesta anterior para conseguir el GAE SERVER_SOFTWARE variables; La variable de entorno SERVER_SOFTWARE es un defecto CGI por lo tanto su un entorno de servidor web y no es accesible a través de los VARs de entorno del sistema, pero está disponible desde el ServletContext.

Este es el código que se debe conseguir que el valor de su necesidad (ni idea de lo que su ServerInfo y no ServerSoftware ...):

if (getServletContext().getServerInfo().startsWith("Dev")) {
  // Load MyConstants-dev.properties
} else {
  // Load MyConstants-prod.properties
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top