Как сказал @Matthew Flaschen, есть системные свойства, которые вы можете проверить, чтобы определить, присутствует GAE или нет. Эта ссылка дает подробности.
Если вы пойдете по этому пути, ваше приложение должно быть построено так, чтобы основной код не имел статических зависимостей от классов GAE; т.е. нет импорта или других ссылок на пакеты и классы GAE в коде (кроме имен классов GAE и т. д. в литералах String). Все зависимости должны быть изолированы от кода, который загружается с использованием Class.forName(String)
ПОСЛЕ того, как вы определили, присутствует GAE или нет.
Это представляет нетривиальные накладные расходы:
- Вы, вероятно, получите дополнительный интерфейс Adapter и (как минимум) две реализации для случаев GAE и не-GAE.
- У вас есть (незначительные) накладные расходы времени динамической загрузки соответствующего класса при запуске и вызова через интерфейс адаптера.
- В результате ваш JAR-файл стал намного больше.
- Теперь вам нужно провести тестирование на двух платформах.
С другой стороны, у вас есть потенциальное преимущество наличия одного JAR, который работает как в контексте GAE, так и вне контекста.