Как в хост-режиме 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> запись в твоем пом.

Другие вопросы по тегам