Как в хост-режиме gwt наблюдаются изменения?
Я запускаю gwt hosted mode через прокси; отладка работает, но она не фиксирует изменения в клиентском коде, сделанные в моей IDE.
Я использую плагин maven для запуска хост-режима; Конфигурация выглядит следующим образом. Причина, по которой код веб-приложения находится в / web, заключается в том, что приложение основано на dropwizard, который не может управлять веб-ресурсами вне 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>
1 ответ
Многоэтапный ответ, начиная с ответа на заголовок, затем объясняя, почему ваше приложение не ведет себя:
Когда приложение GWT отлаживается в режиме разработки, страница запускает hosted.html
файл, который подключается к плагину браузера, который затем пытается прочитать сервер кода, работающий с (по умолчанию) localhost:9997. Когда это соединение установлено, режим dev находит файл модуля и запускает процесс. Пользовательский загрузчик классов 'CompilingClassLoader' используется режимом dev для выполнения другой необходимой работы:
При запуске все
JavaScriptObject
классы должны быть найдены и объединены в один гигантский тип,JavaScriptObject$
, так что вы можете свободно приводить из одной JSO в другую и вызывать любой метод JSO в любой другой JSO. этоJavaScriptObject$
тип синтезируется при запуске модуля.Когда запрашивается какой-либо класс, этот пользовательский загрузчик классов выбирает классы по мере необходимости из файловой системы или из любого jar-файла. Он компилирует их на лету из
.java
файл, отсюда и название. Это делается как для получения нового экземпляра класса с неинициализированными статическими полями, так и для поиска всех методов JSNI и их правильного подключения для вызова в браузере и обратно. Именно из-за этой проводки вы можете вносить изменения в любой файл и просто обновлять браузер - Dev Mode всегда будет пытаться загрузить файл из файловой системы заново и создать необходимый класс Java по мере необходимости.
Компилирующий загрузчик классов читает из вашего classpath - конечно, если он не может найти файл, тогда этот класс не может быть использован, и аналогично, если существует более одной копии файла, то будет использоваться только первая найденная копия..,
Проблема в линии
<goal>resources</goal>
Предполагая, что вы работаете над war
проект, а не lib
эта линия не должна быть там.
Эта строка копирует не только .class
файлы к вашему target/classes
каталог, но также любые другие ресурсы, которые библиотека GWT должна иметь в своем банке. Поскольку вы пишете не библиотеку, а приложение, это не нужно делать здесь, и на самом деле это вызывает проблемы. На пути к классам в режиме разработки, target/classes
это первая запись, за которой следуют ваши исходные каталоги, затем каждый jar на вашем classpath.
Либо когда вы запускаете проект, либо когда вы просите maven скомпилировать его, это gwt:resources
цель запущена, и все источники перемещены. Затем, когда вы редактируете файл из вашей IDE, собственный компилятор IDE обновляет файл.class в target/classes
но не знает что gwt:resources
для, так что не запускайте его заново. Это означает, что в то время как target/classes
имеет последнюю .class
файлы, он устарел .java
файлы.
Если вам нужны ваши исходные файлы, чтобы на самом деле target/classes
либо убедитесь что gwt:resources
работает с каждым изменением ресурса в вашей IDE или другим способом копирования источников непосредственно в target/classes
каталог, чтобы настроить <resource>
запись в твоем пом.