Как режим хостинга gwt наблюдает за изменениями?

Я запускаю режим размещения gwt через прокси; отладка работает, но не фиксирует изменения в клиентском коде, сделанные в моей среде IDE.

Я использую плагин maven для запуска режима размещения; конфигурация следующая. Причина, по которой код веб-приложения находится в /web, заключается в том, что приложение основано на дропвизарде, который не может серверировать веб-ресурсы вне root; таким образом, у меня есть src/main/webapp/web/* в качестве моих веб-ресурсов.

Так что же не так с этой конфигурацией maven?

    <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>gwt-maven-plugin</artifactId>
            <version>2.5.1</version>
            <configuration>
                <webappDirectory>${project.build.outputDirectory}/web</webappDirectory>
                <hostedWebapp>${project.build.outputDirectory}/web</hostedWebapp>
                <!--<copyWebapp>true</copyWebapp>-->
                <module>com.flavor8.todo</module>
                <runTarget>index.htm</runTarget>
                <persistentunitcache>false</persistentunitcache>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>compile</goal>
                        <goal>test</goal>
                        <goal>resources</goal>
                    </goals>
                </execution>
            </executions>
            <dependencies>
                <dependency>
                    <groupId>com.google.gwt</groupId>
                    <artifactId>gwt-user</artifactId>
                    <version>2.5.1</version>
                    <scope>provided</scope>
                </dependency>
                <dependency>
                    <groupId>com.google.gwt</groupId>
                    <artifactId>gwt-dev</artifactId>
                    <version>2.5.1</version>
                    <scope>provided</scope>
                </dependency>
                <dependency>
                    <groupId>com.google.gwt</groupId>
                    <artifactId>gwt-servlet</artifactId>
                    <version>2.5.1</version>
                    <scope>provided</scope>
                </dependency>
            </dependencies>
        </plugin>

person user717847    schedule 15.12.2013    source источник


Ответы (1)


Многоэтапный ответ, начиная с ответа на заголовок, а затем объясняя, почему ваше приложение не работает:

Когда приложение GWT отлаживается в режиме разработки, страница запускает файл hosted.html, который подключается к подключаемому модулю браузера, который затем пытается прочитать сервер кода, работающий по адресу (по умолчанию) localhost:9997. Когда это соединение установлено, режим разработки находит файл модуля и запускает работу. Пользовательский загрузчик классов CompilingClassLoader используется в режиме разработки для выполнения другой необходимой работы:

  • При запуске все классы JavaScriptObject должны быть найдены и объединены в один гигантский тип JavaScriptObject$, чтобы вы могли свободно выполнять преобразование из одного JSO в другой и вызывать любой метод JSO в любом другом JSO. Этот тип JavaScriptObject$ синтезируется при запуске модуля.

  • Когда запрашивается какой-либо класс, этот пользовательский загрузчик классов выбирает классы по мере необходимости из файловой системы или из любого jar-файла. Он компилирует их на лету из файла .java, отсюда и название. Это делается как для того, чтобы получить новый экземпляр класса с неинициализированными статическими полями, так и для того, чтобы найти все методы JSNI и правильно связать их для вызова в браузер и обратно. Благодаря этой связи вы можете вносить изменения в любой файл и просто обновлять браузер - режим разработки всегда будет пытаться загрузить файл из файловой системы свежим и создать фактический класс Java по мере необходимости.

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


Проблема в линии

<goal>resources</goal>

Предположим, вы работаете над проектом war, а не над lib, поэтому эта строка не нужна.

Эта строка копирует не только файлы .class в каталог target/classes, но и любые другие ресурсы, которые библиотеке GWT необходимо иметь в своем jar-файле. Поскольку вы пишете не библиотеку, а приложение, здесь этого делать не нужно, и на самом деле это вызывает проблемы. В пути к классам режима разработки target/classes является первой записью, за которой следуют ваши исходные каталоги, а затем каждый jar в вашем пути к классам.

Либо когда вы запускаете проект, либо когда вы просите maven его скомпилировать, эта цель gwt:resources запускается, и все исходники перемещаются. Позже, когда вы редактируете файл из IDE, собственный компилятор IDE обновляет файл .class в target/classes, но не знает, для чего предназначен gwt:resources, поэтому не запускает его повторно. Это означает, что хотя target/classes содержит последние .class файлов, в нем есть .java устаревших файлов.

Если вам нужно, чтобы ваши исходные файлы действительно находились в target/classes, либо убедитесь, что gwt:resources запускается при каждом изменении ресурсов в вашей среде IDE, либо другой способ скопировать исходники непосредственно в каталог target/classes — настроить запись <resource> в вашем файле pom.

person Colin Alworth    schedule 16.12.2013
comment
Отлично, спасибо, сэр. Я не уверен, как я вообще протащил туда строку ресурсов, но ее удаление помогло. - person user717847; 16.12.2013
comment
Мой недавний опыт (это возникало несколько раз за последние несколько недель, в основном в ##gwt на irc) заключается в том, что есть несколько руководств по gwt/maven, в которых это есть, поэтому они копируются в новые проекты. - person Colin Alworth; 16.12.2013