- PVSM.RU - https://www.pvsm.ru -
Наше JEE приложение сделало скачок версии GWT с 1.7 сразу до 2.6.1. Когда-то были небольшие танцы с бубном для того, чтобы в среде разработки IntelliJ Idea настроить возможность отладки клиентской части. Отладка заключается в возможности ставить точки останова (breakpoint-ы) в Java-коде, но попадать в них из браузерного JavaScript-а, сгенерированного GWT из Java-кода. После обновления версии GWT старая конфигурация запуска отладки работать перестала, и мне пришлось познакомиться с GWT Super Dev Mode (SDM). После этого «знакомства» я понял, что выше упомянутые «танцы» были на самом деле предельно простой и понятной настройкой, по крайней мере, в сравнении с SDM. Надеюсь, кому-то эта статья очень поможет сэкономить пару-тройку дней блужданий по форумам и избавит от нескольких новых седых волос. В статье я расскажу про опыт запуска режима SDM в следующем окружении: IntelliJ Idea 14, JBoss EAP 6, GWT 2.6.1 с применением в проекте GWT RPC, браузер Chrome. Несмотря на то, что при релизе Idea 14 сообщили о доработках касательно отладки в GWT, думаю, что для версии 13 всё нижеописанное также применимо. Используемый сервер приложений также вряд ли как-то влияет на настройку SDM. Насчет версий GWT: для 2.6.0 применимо почти один-в-один, то же касается и 2.7.0 (сам не проверял, вычитал в Сети по ходу проведения исследований).
Старый добрый режим отладки теперь практически не поддерживается в GWT, его место занял режим Super Dev Mode. Этот режим предполагает запуск специфического сервера приложений, так называемого Code Server, который несет ответственность за развертывание исходного Java-кода и сопоставление его с JavaScript-ом. В большинстве источников описывается развертывание вашего приложения под управлением Code Server и работа непосредственно с ним. Т.к. я использую в качестве среды разработки IntelliJ Idea, то предполагается, что мое приложение будет запущено и развернуто прямо в ней. Но в JEE разработчики обычно стараются работать с окружением, максимально приближенном к промышленному, а запуск промышленного сервера «из под Idea» — нонсенс. Таким образом, возникает дилемма: Code Server запущен в среде разработки, а сервер приложений запущен на отдельном компьютере — как их «подружить»? В принципе, в Сети есть вся нужная информация, но она разрознена, противоречива, а есть даже ответ на StackOverflow, имеющий множество «плюсов», но при этом неверный. Исходя из этих фактов, а также понимая насколько в общем и целом непросто запустить SDM, я и решил написать это руководство.
<add-linker name="xsiframe"/>
Без нее SDM работать не будет. В GWT 2.7 это сконфигурировано по умолчанию, поэтому можно не добавлять. Можно собирать с этим параметром и на промышленный сервер.
<set-configuration-property name="devModeUrlWhitelistRegexp" value="http://192.168.1.1(:d+)?/.*" />
В ней указать IP-адрес компьютера разработчика, на котором будет запущен Code Server. При сборке приложения для промышленного сервера, этот параметр желательно удалить/закомментировать.
<set-configuration-property name="devModeRedirectEnabled" value="true"/>
/**
* Метод переопределен исключительно для отладки в режиме GWT SDM. Для того, чтобы сервер заработал в режиме
* отладки GWT SDM следует указать системные свойства gwt.codeserver.port (стандартное св-во GWT SDM) и
* gwt.codeserver.host (специфическое св-во нашей Системы). После указания этих свойств и перезапуска сервера
* файлы .gwt.rpc будут подтягиваться с указанного хоста, на котором должен быть запущен GWT Code Server. Это
* требуется для того, чтобы отлаживаемый клиент имел те же версии скомпилированных типов, что и сервер.
* ВНИМАНИЕ! Не допускать указание этих свойств на промышленных серверах!
*/
protected String getCodeServerPolicyUrl(String strongName) {
String port = System.getProperty("gwt.codeserver.port");
String host = System.getProperty("gwt.codeserver.host");
if (port == null || port.trim().isEmpty() || host == null || host.trim().isEmpty()) {
return super.getCodeServerPolicyUrl(strongName);
}
return "http://" + host + ":" + port + "/policies/" + strongName + ".gwt.rpc";
}
Из содержания комментария к методу можно понять, что разработчики GWT предусмотрели возможность указания только для номера порта, на котором находится Code Server, но не сетевого адреса, т.е., судя по всему, они не предполагали, что сервер приложений и Code Server могут быть разными компьютерами.
throw new UnableToCompleteException();
в самом конце файла. Исходники находятся в самом gwt-codeserver.jar; вытаскиваем .java, изменяем, компилируем, закидываем .class обратно в gwt-codeserver.jar. Библиотека нужна только разработчику, а на промышленном сервере (да и на тестовом тоже) ей делать нечего, так что поводов для беспокойства по поводу такого бесцеремонного обращения нет.
ВНИМАНИЕ! По завершении отладки в режиме GWT SDM следует откатить изменения в .gwt.xml («devModeUrlWhitelistRegexp») и пересобрать приложение!
Автор: bobzer
Источник [1]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/java/74258
Ссылки в тексте:
[1] Источник: http://habrahabr.ru/post/242989/
Нажмите здесь для печати.