Frage

Ich habe den Aufbau eine GWT 1.7 + GAE Anwendung die Eclipse-Plugin verwenden. Die Systemkonstanten werden in eine MyConstants.properties-Datei geladen, die von der Singleton MyConstants Klasse geladen wird, um die ... gwt.i18n.client.Constants Klasse erweitert.

Ich möchte mich für MyConstants eine von mehreren Dateien wie

enthält Einstellungen laden
  • MyConstants-local.properties
  • MyConstants-alpha.properties
  • MyConstants-beta.properties
  • MyConstants-prod.properties

Ich habe mehrere Verweise auf Guice der Enum Bühne gefunden, aber dies scheint nicht durch Gin unterstützt werden. Außerdem ist es nur Griffe dev / prod und ich brauche auf jeden Fall eine lokale / beta / prod Lösung.

Gibt es eine Möglichkeit, dies mithilfe einer Befehlszeile arg oder eine andere Instanz definiert Laufzeitparameter zu tun, die, wenn sie auf GAE geladen funktionieren wird?

War es hilfreich?

Lösung

Auf der GAE Server-Seite, ich konnte meine dev Umgebung von jeder eingesetzten Produktionsumgebung mit dieser Bit-Code unterscheiden.

Erstellen Sie eine Schnittstelle und zwei Klassendateien.

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

ein wenig Guice Magie Definieren Sie den „user.dir“ env var Bindung verwenden. Das letzte Verzeichnis innerhalb des user.dir Pfades ist entweder die eindeutig Google App Engine Application Identifier oder Ihre Root-Projektentwicklung Verzeichnis. Sobald Sie wissen, können Sie bestimmen, welche der Konstanten eingestellt zu verwenden.

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

Dies ermöglicht es mir dev / prod Konstanten in Klassen wie diese zu injizieren:

public class MyDomainClass {

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

Andere Tipps

sollten Sie verwenden die speziell gemacht typsichere Schnittstelle, dies zu trainieren ...

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

Eine Sache, die zwischen der Entwicklung und im Einsatz Umgebung anders ist, ist die SERVER_SOFTWARE Umgebungsvariable:

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

Vielleicht können Sie auswählen, welcher Modul Guice aus der Basis, dass zu laden.

Auf der obige Antwort für den GAE bekommen SERVER_SOFTWARE Variable; Die SERVER_SOFTWARE Umgebungsvariable ist ein CGI-Standard seine deshalb eine Einstellung Web-Server und kann nicht zugegriffen werden durch die Systemumgebung Vars aber vom ServletContext zur Verfügung.

Hier ist der Code, den Sie den Wert bekommen sollte Ihre benötigen (Keine Ahnung, warum seine Serverinfo und nicht die Serversoftware ...):

if (getServletContext().getServerInfo().startsWith("Dev")) {
  // Load MyConstants-dev.properties
} else {
  // Load MyConstants-prod.properties
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top