Как изменять константы в зависимости от экземпляра развертывания

StackOverflow https://stackoverflow.com/questions/1682835

Вопрос

Я создавал приложение GWT 1.7 + GAE с использованием плагина eclipse.Системные константы загружаются в файл MyConstants.properties, который загружается одноэлементным классом MyConstants, расширяющим ...gwt.i18n.client.Класс Constants.

Я бы хотел, чтобы MyConstants загрузил один из нескольких файлов, содержащих такие настройки, как

  • MyConstants-local.свойства
  • MyConstants-альфа.свойства
  • MyConstants-бета-версия.свойства
  • MyConstants-произв.свойства

Я нашел несколько ссылок на этап перечисления Guice, но, похоже, это не поддерживается gin.Кроме того, он обрабатывает только dev / prod, и мне определенно нужно локальное / бета / prod-решение.

Есть ли способ сделать это с помощью аргумента командной строки или какого-либо другого определенного экземпляром параметра времени выполнения, который будет работать при загрузке в GAE?

Это было полезно?

Решение

На стороне сервера GAE я смог отличить свою среду разработки от любой развернутой производственной среды с помощью этих фрагментов кода.

Создайте один интерфейс и два файла классов.

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

Определите немного привязки Guice magic, используя переменную env "user.dir".Последним каталогом в пути user.dir является либо уникальный идентификатор приложения Google App Engine, либо ваш корневой каталог разработки проекта.Как только вы узнаете это, вы сможете определить, какой набор констант использовать.

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

Это позволяет мне вводить константы dev / prod в классы, подобные этому:

public class MyDomainClass {

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

Другие советы

Вы должны использовать специально созданный типобезопасный интерфейс, чтобы решить эту проблему...

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

Единственная вещь, которая отличается между средой разработки и развернутой средой, - это SERVER_SOFTWARE переменная среды:

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

Возможно, вы сможете выбрать, какой модуль Guice загружать, исходя из этого.

На приведенный выше ответ для получения GAE СЕРВЕР_СОФТОВОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ переменная;Переменная среды SERVER_SOFTWARE является CGI по умолчанию, поэтому она является настройкой веб-сервера и недоступна через переменные системной среды, но доступна из ServletContext.

Вот код, который должен дать вам нужное вам значение (понятия не имею, почему это ServerInfo, а не ServerSoftware ...):

if (getServletContext().getServerInfo().startsWith("Dev")) {
  // Load MyConstants-dev.properties
} else {
  // Load MyConstants-prod.properties
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top