определить, выполняется ли код во время выполнения ядра приложения (Java) - PullRequest
7 голосов
/ 10 ноября 2010

Как можно определить, выполняется ли какой-либо код (сервлет или простой класс) в среде выполнения Google App Engine (Java), чтобы можно было решить, использовать ли специальные библиотеки ядра приложения или нет? Есть ли для этого надежный идентификатор среды выполнения?

Ответы [ 6 ]

4 голосов
/ 10 ноября 2010

Вы можете проверить свойство com.google.appengine.runtime.version:

String appEngineVersion = System.getProperty("com.google.appengine.runtime.version");

Если оно установлено, то это App Engine.

Но вместо этого я хотел бы использовать отдельные цели сборки, чтобы избежать накладных расходов времени выполнения.

2 голосов
/ 30 марта 2011

похоже на то, что написал @Reza, но немного чище:

используйте SystemProperty.environment.value() для получения " Production " при работе в App Engine и " Development * 1007"* "при запуске на сервере разработки.

1 голос
/ 13 июня 2014

Я не видел здесь безопасного типа решения, поэтому вот оно:

if (SystemProperty.environment.value() == SystemProperty.Environment.Value.Production) {
    // The app is running on App Engine...
}
1 голос
/ 11 марта 2011

Как объяснено здесь вы можете проверить следующее свойство:

String environment = System.getProperty(
    "com.google.appengine.runtime.environment")

environment - это «Производство» при работе в App Engine и «Разработка» при запуске на сервере разработки.

1 голос
/ 10 ноября 2010

Как сказал @Matthew Flaschen, есть системные свойства, которые вы можете проверить, чтобы определить, присутствует GAE или нет. Эта ссылка дает подробности.

Если вы пойдете по этому пути, ваше приложение должно быть построено так, чтобы основной код не имел статических зависимостей от классов GAE; т.е. нет импорта или других ссылок на пакеты и классы GAE в коде (кроме имен классов GAE и т. д. в литералах String). Все зависимости должны быть изолированы от кода, который загружается с использованием Class.forName(String) ПОСЛЕ того, как вы определили, присутствует GAE или нет.

Это представляет нетривиальные накладные расходы:

  • Вы, вероятно, получите дополнительный интерфейс Adapter и (как минимум) две реализации для случаев GAE и не-GAE.
  • У вас есть (незначительные) накладные расходы времени динамической загрузки соответствующего класса при запуске и вызова через интерфейс адаптера.
  • В результате ваш JAR-файл стал намного больше.
  • Теперь вам нужно провести тестирование на двух платформах.

С другой стороны, у вас есть потенциальное преимущество наличия одного JAR, который работает как в контексте GAE, так и вне контекста.

0 голосов
/ 12 ноября 2010

Есть и другой способ сделать это. Это хорошо объясняется в документации gaevfs о том, как писать Portable Code: http://code.google.com/p/gaevfs/wiki/ApplicationPortability

Вас интересует следующая строка:

boolean isGoogleAppEngine = getServletContext().getServerInfo().contains( "Google" );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...