С введением GAE-модулей платформа Google App Engine приблизилась к реализации платформы Java EE. При этом структура GAE-приложений стала совпадать со структурой Java EE приложений, где EAR-архив объединяет WAR-архивы модулей, а среда выполнения Google App Engine стала сервером приложений, обеспечивающим работу модулей. Отличие заключается в том, что GAE-приложение использует неупакованные EAR и WAR каталоги.

GAE-модули призваны разделить в пределах одного приложения обработку специфических запросов, таких как запросы от мобильных устройств, запросы администратора, фоновые или Backend-запросы. При этом каждый GAE-модуль работает как самостоятельное приложение, имеющее свои экземпляры среды выполнения и разделяющее с другими GAE-модулями общие сервисы и общую политику безопасности.
 
Каждый GAE-модуль имеет исходный код и конфигурационные файлы и идентифицируется своей версией, которая представлена именем, состоящим из цифр, букв и дефисов. При этом версия не должна быть длиннее 63 символов и начинаться и заканчиваться дефисом. Имя модуля определяется тегом <module>name</module> в файле appengine-web.xml модуля.
 
Каждый GAE-модуль имеет свой уникальный URI-адрес для запроса в виде v1.my-module.my-app.appspot.com.
 
Если сравнивать с предыдущими Frontend и Backend экземплярами GAE-приложения, то Frontend-экземплярам соответствуют GAE-модули с автоматическим масштабированием, резидентным Backend-экземплярам соответствуют GAE-модули с ручным масштабированием, а динамическим Backend-экземплярам соответствуют GAE-модули с базовым масштабированием.
 
EAR-каталог GAE-приложения содержит META-INF папку с конфигурационными файлами appengine-application.xml (информация развертывания) и application.xml (список модулей), а также WAR-каталоги модулей, которые содержат WEB-INF папку с конфигурационными файлами appengine-web.xml (конфигурация модуля) и web.xml (информация развертывания).
 
Каждое GAE-приложение должно иметь один модуль по умолчанию, который имеет тег <module>default</module> в файле appengine-web.xml или вообще не имеет тега <module>. Модуль по умолчанию имеет URI-адрес http://app-id.appspot.com.
 
В простом случае файл appengine-application.xml имеет вид:
 
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<appengine-application xmlns="http://appengine.google.com/ns/1.0">
<application>my-application</application>
</appengine-application>
Файл application.xml:
 
<?xml version="1.0" encoding="UTF-8"?>
<application
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/application_5.xsd"
version="5">
 
 
<description></description>
<display-name></display-name>
<module>
<web>
<web-uri>default</web-uri>
<context-root>default</context-root>
</web>
</module>
<module>
<web>
<web-uri>my-module</web-uri>
<context-root>my-module</context-root>
</web>
</module>
</application>
Для Frontend-модулей в файл appengine-web.xml можно включить теги:
 
<instance-class></instance-class>
<automatic-scaling>
<min-idle-instances></min-idle-instances>
<max-idle-instances></max-idle-instances>
<min-pending-latency></min-pending-latency>
<max-pending-latency></max-pending-latency>
<max-concurrent-requests></max-concurrent-requests>
</automatic-scaling>
Для Backend-модулей в файл appengine-web.xml включаются теги:
 
<instance-class></instance-class>
<basic-scaling>
<max-instances></max-instances>
<idle-timeout></idle-timeout>
</basic-scaling>
Или
 
<instance-class></instance-class>
<manual-scaling>
<instances></instances>
</manual-scaling>
Для бесплатного GAE-приложения максимальное число модулей 5 с максимальным числом версий 15.
 
В отличие от предыдущих Backend-экземпляров, которые по умолчанию были private, все GAE-модули по умолчанию public.
 
Перенаправлять пользовательские запросы GAE-модулям можно двумя способами.
 
Первый способ программный:
 
ModulesService modulesApi = ModulesServiceFactory.getModulesService();
URL url = new URL("http://" + modulesApi.getVersionHostname("my-backend-module","v1"));
Второй способ статический, с помощью dispatch.xml файла WEB-INF каталога GAE-модуля по умолчанию, который может содержать до 10 перенаправлений:
 
<?xml version="1.0" encoding="UTF-8"?>
<dispatch-entries>
<dispatch>
<!-- Send all mobile traffic to the mobile frontend. -->
<url>*/mobile/*</url>
<module>mobile-frontend</module>
</dispatch>
. . .
</dispatch-entries>
Файл dispatch.xml имеет приоритетное значение перед файлом cron.xml при совпадении в них адресов, но не совпадении модулей.
 
Для создания модульного GAE-приложения в среде Eclipse, скачаем Eclipse IDE for Java EE Developers и установим Google Plugin for Eclipse.
 
В перспективе Java EE среды Eclipse, в меню File выберем New | Dynamic Web Project.
 
Введем имя проекта, отметим флажок Add project to an EAR и нажмем Finish.
 
В результате будет создан проект GAE-приложения и проект GAE-модуля.
 
Для развертывания GAE-приложения нажмем правой кнопкой мышки на проекте и выберем Google App Engine WTP | Deploy Project to Remote Server, выберем Google App Engine, нажмем Next | Next, выберем проект и нажмем Add, нажмем Finish. Введем идентификатор приложения и нажмем OK.