Question

J'ai construit une application GWT 1.7 + GAE à l'aide du plug-in Eclipse. Les constantes du système sont chargées dans un fichier MyConstants.properties qui est chargé par la classe singleton de MyConstants extension de la classe ... gwt.i18n.client.Constants.

Je voudrais que MyConstants pour charger l'un de plusieurs fichiers contenant des paramètres tels que

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

J'ai trouvé plusieurs références à Enum Stage Guice, mais cela ne semble pas être pris en charge par le gin. Par ailleurs, il ne gère que dev / prod et j'ai besoin certainement une solution locale / beta / prod.

Est-il possible de le faire en utilisant une ligne de commande cmd ou un autre paramètre d'exécution défini par exemple qui fonctionne lorsqu'il est chargé sur GAE?

Était-ce utile?

La solution

Du côté du serveur GAE, j'ai pu distinguer mon environnement de dev de tout environnement de production déployé avec ces bits de code.

Créer une interface et deux fichiers 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"; };
}

Définir un peu de magie Guice liaison à l'aide du var env « user.dir ». Le dernier répertoire dans le chemin user.dir est soit l'application unique Google App Engine Identifiant ou votre répertoire de développement du projet racine. Une fois que vous savez cela, vous pouvez déterminer un ensemble de constantes à utiliser.

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

Cela me permet d'injecter des constantes dev / prod dans des classes comme celle-ci:

public class MyDomainClass {

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

Autres conseils

Vous devez utiliser l'interface de type sécurisé spécialement fait pour nous en sortir ...

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

Une chose qui est différent entre le développement et l'environnement déployé est la variable d'environnement SERVER_SOFTWARE:

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

Peut-être que vous pouvez choisir quel module Guice à la charge en fonction de cela.

Sur la réponse ci-dessus pour obtenir le GAE SERVER_SOFTWARE variable; La variable d'environnement SERVER_SOFTWARE est un défaut CGI donc son un paramètre de serveur Web et n'est pas accessible par l'environnement du système vars mais il est disponible ServletContext.

Voici le code qui devrait vous obtenir la valeur de votre besoin (Aucune idée pourquoi son ServerInfo et non ServerSoftware ...):

if (getServletContext().getServerInfo().startsWith("Dev")) {
  // Load MyConstants-dev.properties
} else {
  // Load MyConstants-prod.properties
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top