Запуск GWT Super Dev Mode для віддаленого сервера

Наше 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, я і вирішив написати це керівництво.

Доопрацювання та налаштування
  • У все .gwt.xml додати рядок
    <add-linker name="xsiframe"/>

    Без неї SDM працювати не буде. В GWT 2.7 це налаштовано за замовчуванням, тому можна не додавати. Можна збирати з цим параметром і на промисловий сервер.
  • У все .gwt.xml додати рядок
    <set-configuration-property name="devModeUrlWhitelistRegexp" value="http://192\.168\.1\.1(:\d+)?/.*" />

    У ній вказати IP-адресу комп'ютера розробника, на якому буде запущений Code Server. При складанні програми для промислового сервера, цей параметр бажано видалити/закоментувати.
  • Для версії GWT 2.6.0 в усі .gwt.xml додати рядок
    <set-configuration-property name="devModeRedirectEnabled" value="true"/>
  • Якщо ви використовуєте GWT RPC, то у всіх спадкоємців RemoteServiceServlet слід перевизначити метод getCodeServerPolicyUrl. Я зробив це так:
    /**
    * Метод змінені виключно для налагодження в режимі 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 можуть бути різними комп'ютерами.
  • Вказати значення системних властивостей "gwt.codeserver.host" і "gwt.codeserver.port" для тестового сервера додатків. Це можна зробити шляхом зазначення параметрів старту JVM-Dgwt.codeserver.host= -D=gwt.codeserver.port=, або з використанням специфічних для вашого сервера інструментів. У JBoss EAP для цього можна додати в конфігураційний файл (standalone*.xml, domain.xml) блок <system-properties> в ньому. Переконайтеся в тому, що після запуску Code Server-а у вас є доступ до сервера додатків за зазначеною адресою і порту (telnet «провалюється»).
    Додати в Idea нову конфігурацію GWT Configuration та вказати в ній:
    • Включити чекбокс «Use Super Dev Mode»
    • Якщо після старту налагодження побачите в балці «log4j:ERROR», то в «VM options» додайте -Dlog4j.ignoreTCL=true. Можливо, вам це не знадобиться, у мене виникли якісь колізії GWT з проектними бібліотеками логування
    • «Dev Mode parameters» додати -bindAddress 192.168.1.1, де вказати IP-адресу Code Server (комп'ютера розробника). За замовчуванням CodeServer слухає localhost або 127.0.0.1, але якщо сервер додатків знаходиться на іншому комп'ютері, то він не зможе отримати доступ до CodeServer-у за такими адресами, тому слід зазначити CodeServer-у, щоб він прослуховував адресу, доступний ззовні.

    GWT 2.6.1 є глюк, що виявляється при запуску CodeServer-а в Idea (можливо, його немає при незалежному від середовища розробки запуску). Проблема полягає в тому, що здійснюється спроба повторно створити папку тимчасових файлів при розгортанні програми, яка завершується помилкою, що призводить до зупинки CodeServer-а. Щоб вирішити цю проблему мені довелося пропатчити бібліотеку gwt-codeserver.jar, в якій в класі CompileDir я закомментировал рядок
    throw new UnableToCompleteException();

    в самому кінці файлу. Исходники знаходяться в самому gwt-codeserver.jar; витягуємо .java, змінюємо, компілюємо, закидаємо .class назад у gwt-codeserver.jar. Бібліотека потрібна тільки розробнику, а на промисловому сервері (та й на тестовому теж) їй робити нічого, так що приводів для занепокоєння з приводу такого безцеремонного поводження немає.


    Запуск
    • Перезібрати додаток і запустити ваш сервер
    • Запустити CodeServer (конфігурацію GWT Configuration) в режимі Debug
    • Відкрити в браузері Chrome адресу, вказану в балці CodeServer-а (http://192.168.1.1:9876/)
    • Перенести в «Вибране» браузера кнопки «Dev Mode On» і «Dev Mode Off»
    • Наше додаток налаштоване так, що при вході в Систему відкривається вікно з відключеними елементами керування браузера, в т. ч. «Вибране». Якщо ви робите так само, то змініть ваш HTML так, щоб у клієнтській частині були доступні «Dev Mode On» і «Dev Mode Off»
    • Відкриваємо клієнтську частину в браузері і натискаємо «Dev Mode On», потім тиснемо кнопку «Compile»
    • Чекаємо поки на стороні Code Server-а завершиться компіляція. Після цього сторінка буде перезавантажена.
    • Після перезавантаження сторінки натисканням F12 в Chrome відкриваємо стандартні інструменти розробника, в яких відкриваємо вкладку Sources. У дереві зліва (вкладка Sources всередині вкладки Sources) видно, що в даний момент є ресурси, завантажені не тільки з основного сервера додатків, але і з CodeServer. Тиснемо CTRL+P, шукаємо Java-клас, який збираємося налагоджувати, ставимо в ньому Breakpoint.


    УВАГА! По завершенні налагодження в режимі GWT SDM слід відкотити зміни .gwt.xml («devModeUrlWhitelistRegexp») і перезібрати додаток!

    Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.