Преобразование простого Java-проекта AppEngine для использования модулей

Этот вопрос похож на этот, но это не решило мою проблему.

У меня очень простое приложение Google AppEngine / Java. Он работает с 2011 года и не использует maven или другие модные вещи, которые мне не нужны. Недавно я добавил облачные конечные точки в это приложение. Я не использовал сгенерированный endpoint-libsпотому что мне это, похоже, не нужно, и все прекрасно работает без него.

В течение некоторого времени приложение имело фронтенд и бэкэнд. Сейчас я пытаюсь преобразовать их в модули: внешний интерфейс станет модулем по умолчанию, а внутренний станет другим модулем.

Структура моего старого проекта такова:

project
 |- src
 |   |- ... Java source files ...
 |
 |- war
 |   |- WEB-INF
 |   |   |- appengine.xml
 |   |   |- backends.xml
 |   |   |- cron.xml
 |   |   |- web.xml

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

Я понимаю, что мне нужно создать каталог для каждого модуля, например:

project
 |- default
 |   |- WEB-INF
 |   |   |- appengine.xml
 |   |   |- cron.xml
 |   |   |- web.xml
 |
 |- module
 |   |- WEB-INF
 |   |   |- appengine.xml
 |   |   |- web.xml
 |
 |- META-INF
 |   |- appengine-application.xml
 |   |- application.xml

Мои вопросы:

  • Где я должен положить src каталог?
  • Должен ли я объявить мои классы оконечной точки облака в default/WEB-INF/web.xml?
  • Может ли каждый модуль иметь свой WEB-INF/cron.xml?

Если мне кажется, что я не знаю, что я делаю, это, вероятно, правильно, но я не хочу помещать все в pom-файл maven, писать сценарии gradle и так далее, и вместо этого сосредоточиться на реальном приложении. Вероятно, потому, что я вырос на vi и emacs, когда мы сами писали код.;)

Обновить:

Я помещаю каталог src в project на том же уровне, что и default а также module, Скомпилированные классы Java появляются под default/WEB-INF/classes, что говорит о том, что я что-то сделал правильно. GAE генерирует *.api файл в default/WEB-INF, которого я раньше не видел, когда не использовал модули.

Локально я вижу свои облачные API-интерфейсы конечных точек и могу их использовать. При развертывании в AppEngine и попытке использовать проводник API я получаю исключение:

/_ah/spi/BackendService.getApiConfigs java.lang.NullPointerException на com.google.api.server.spi.SystemServiceServlet.execute(SystemServiceServlet.java:100) на com.google.api.server.spi.SystemServerService.java:71) на javax.servlet.http.HttpServlet.service(HttpServlet.java:637) на javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

и так далее...

Я добавил учетные данные OAuth2 и установил их в своей конфигурации конечной точки облака. Я не мог найти код для SystemServiceServlet, но я думаю, что он не может найти мои классы API (которые настроены в default/WEB-INF/web.xml).

Еще одно обновление:

Я узнал, что для модулей AppEngine требуется структура корпоративного архива (ушей), и развертывание, как простого приложения GAE, работать не будет. Развертывание "одним нажатием кнопки" отсутствует. Я следовал инструкциям в Программировании Google App Engine с помощью Java и закончил кучей проектов Eclipse. Это довольно предприимчиво, но я могу заставить его выбросить то же исключение, что и простая версия, которую я развернул ранее. Интересно, добился ли я вообще никакого прогресса.

3 ответа

Я создал Appstart ( https://github.com/omerio/appstart) стандартное мультимодульное приложение App Engine, которое демонстрирует использование нескольких технологий, включая Cloud Endpoints, и имеет 3 модуля: модуль fronend, модуль backend и Общий модуль, который включает в себя все общие классы, общие для модулей.

Проекты настраиваются в родительской папке appstart с POM родительского maven. Вы можете легко оформить заказ, удалить то, что вам не нужно, добавить свой код, и у вас должен быть многомодульный проект. В качестве альтернативы вы можете структурировать свой код аналогично appstart. В этом случае вам нужно сделать следующее:

  • В папке вашего проекта добавьте родительский пом <packaging>pom</packaging> и добавьте свои модули к нему (см. пример pom для appstart parent).
  • Для каждого из ваших модулей включите пом, который имеет родительский элемент <parent> (см. appstart-frontend pom в качестве примера).
  • Вам нужно создать проект с упаковкой для ушей (Enterprise ARchive), это облегчает развертывание всех ваших модулей за один раз (см. Пример appstart-ear)

Конечные точки вашего облака могут быть объявлены в вашем файле по умолчанию / WEB-INF / web.xml, как и в appstart web.xml.

Пример cron.xml также включен в appstart-frontend. Файл cron.xml должен быть добавлен в модуль по умолчанию, как указано в документах App Engine. Для вызова задания cron в модуле просто включите <target>my-module</target> элемент в cron.xml.

Хотя в документах настоятельно сказано, что для этого нужно ухо, это не так. Вы можете просто добавить определение модуля в appengine-web.xml, и ваша война будет развернута в указанном модуле. Модуль по умолчанию:

<module>default</module>

И для бэкэнда

<module>backend</module>
<manual-scaling> ... </manual-scaling>

Преимущество этого заключается в использовании одного и того же кода по умолчанию и других модулей, но требует некоторого способа его переключения во время развертывания (без заточки шестерен больше, я использую профили maven), вы можете просто создать другую ветку или сделать это вручную. Тогда вы сможете нормально развернуться, но вам нужно будет сделать это дважды.

Это самый простой путь миграции, который я когда-либо видел, установка уха является болезненной, если у вас уже есть война.

В конце концов я внимательно следовал инструкциям, приведенным в Программировании Google App Engine с помощью Java (глава 5), и постепенно добавил свой старый код. Это сработало, и я больше не получал исключение нулевого указателя (не знаю, что его вызвало).

Некоторые моменты, о которых следует знать:

  • Модули не делятся кодом. В Eclipse вы можете создать ссылку в одном проекте на исходную папку в другом проекте. Это лучший способ поделиться кодом, который я смог найти.
  • Вы должны использовать перспективу Java EE в Eclipse. Здесь есть вкладка "Серверы", которая включает кнопку GAE с пунктом меню "Развертывание на удаленный сервер". Это способ развертывания ваших модулей. Элемент контекстного меню "Google / Deploy to AppEngine" не работает для модульных / корпоративных проектов.
  • Специальные файлы, такие как cron.xml и datastore-indexes.xml, должны находиться в каталоге WEB-INF модуля "default".
  • Маршрутизация URL-адресов к модулям на серверах Google сильно отличается от сервера разработки.
  • На сервере разработки локальное хранилище данных находится где-то в каталоге Eclipse. Исправьте это, изменив рабочий каталог в конфигурации сервера: дважды щелкните сервер. Это открывает "редактор сервера". Введите дополнительный аргумент VM: -Ddatastore.backing_store=/C:/wherever/local_db.bin

Структура каталогов моего проекта теперь выглядит следующим образом:

project
 |- default
 |   |- src
 |   |- WebContent
 |   |   |- WEB-INF
 |   |   |   |- appengine.xml
 |   |   |   |- cron.xml
 |   |   |   |- web.xml
 |
 |- module
 |   |- WebContent
 |   |   |- <HTML, CSS etcetera>
 |   |   |- WEB-INF
 |   |   |   |- appengine.xml
 |   |   |   |- web.xml
 |
 |- ear     (the EAR project)
 |   |- EarContent
 |   |   |- META-INF
 |   |   |   |- appengine-application.xml
 |   |   |   |- application.xml

Большая часть этого была произведена, следуя инструкциям в вышеупомянутой книге.

Я надеюсь, что это поможет другим в борьбе с модульными проектами AppEngine.

Другие вопросы по тегам