Pergunta

Eu tenho construir um 1.7 aplicativo GWT + GAE usando o eclipse plugin. As constantes do sistema são carregados em um arquivo MyConstants.properties que é carregado pela classe MyConstants únicas estender a ... classe gwt.i18n.client.Constants.

Eu gostaria que MyConstants para uma carga de vários arquivos contendo configurações como

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

Eu encontrei várias referências para Enum Stage do Guice, mas isso não parece ser apoiada por gin. Além disso, ele só lida com dev / prod e eu definitivamente precisa de uma solução local / beta / prod.

Existe uma maneira de fazer isso usando um argumento de linha de comando ou outra instância de parâmetro de tempo de execução definido que vai funcionar quando carregado em GAE?

Foi útil?

Solução

No lado do servidor do GAE, eu era capaz de distinguir o meu ambiente de dev de qualquer ambiente de produção implantado com esses pedaços de código.

Criar uma interface e dois arquivos de 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"; };
}

Definir um pouco de Guice magia de ligação usando o "user.dir" env var. O último diretório dentro do caminho user.dir ou é o único Google App Engine identificador de aplicação ou seu diretório de desenvolvimento do projeto raiz. Depois de saber isso, você pode determinar qual conjunto de constantes para 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);
 }
}

Isso me permite injetar constantes dev / prod em classes como este:

public class MyDomainClass {

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

Outras dicas

Você deve usar a interface de tipo seguro especialmente feito para resolver isso ...

if (SystemProperty.environment.value() == SystemProperty.Environment.Value.Production)
{
  //It's production.
}
else
{
  //It's Dev - and (SystemProperty.environment.value() == SystemProperty.Environment.Value.Development)
}

Uma coisa que é diferente entre o desenvolvimento e ambiente implantado é a variável de ambiente SERVER_SOFTWARE:

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

Talvez você possa escolher qual módulo Guice a carga com base fora disso.

Na resposta acima para obter o GAE SERVER_SOFTWARE variável; A variável de ambiente SERVER_SOFTWARE é um padrão CGI, portanto, é uma configuração de servidor web e não é acessível através do ambiente do Sistema vars, mas está disponível a partir do ServletContext.

Aqui está o código que deve obter-lhe o valor seu precisando (Não faço ideia por sua ServerInfo e não ServerSoftware ...):

if (getServletContext().getServerInfo().startsWith("Dev")) {
  // Load MyConstants-dev.properties
} else {
  // Load MyConstants-prod.properties
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top