gwt托管模式如何观察变化?

时间:2013-12-15 22:46:32

标签: gwt gwt-hosted-mode

我通过代理运行gwt托管模式;调试有效,但它不会对我在IDE中生成的客户端代码进行更改。

我正在使用maven插件启动托管模式;配置如下。 Web应用程序代码位于/ web中的原因是该应用程序基于dropwizard,它不能从根服务器中提供Web资产;因此我有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 个答案:

答案 0 :(得分:3)

多步回答,从标题的答案开始,然后解释为什么您的应用没有表现:

当在开发模式下调试GWT应用程序时,该页面启动hosted.html文件,该文件连接到浏览器插件,然后该插件尝试读取运行的代码服务器(默认情况下)localhost:9997 。建立连接后,开发模式会找到模块文件,并开始运行。 dev模式使用自定义类加载器'CompilingClassLoader'来完成所需的其他工作:

  • 在启动时,需要找到所有JavaScriptObject类并将其合并为一个巨型类型JavaScriptObject$,以便您可以从一个JSO自由地转换为另一个JSO,并调用任何JSO方法在任何其他JSO上。此JavaScriptObject$类型在模块启动时合成。

  • 当请求任何类时,此自定义类加载器会根据需要从文件系统或任何jar中获取类。它从.java文件中动态编译它们,因此得名。这样做既可以获得具有未初始化静态字段的类的新实例,也可以查找所有JSNI方法并正确连接它们以调用浏览器并再次返回。这种连接是您可以对任何文件进行更改并简单刷新浏览器的原因 - 开发模式将始终尝试从文件系统中加载文件,并根据需要创建实际的Java类。

编译类加载器从类路径中读取 - 当然如果找不到文件,则该类不能使用,同样如果文件有多个副本,则只找到第一个副本二手...


问题在于

<goal>resources</goal>

假设您正在处理war项目,而不是lib,则此行不需要在那里。

此行不仅将.class文件复制到您的target/classes目录,还复制GWT库在其jar中需要的任何其他资源。由于您不是在编写库而是编写应用程序,因此不必在此处执行此操作,实际上它会导致问题。在dev模式类路径中,target/classes是第一个条目,后跟源目录,然后是类路径上的每个jar。

当您启动项目或要求maven编译它时,将运行此gwt:resources目标,并移动所有源。然后,当您从IDE编辑文件时,IDE自己的编译器会更新target/classes中的.class文件,但不知道gwt:resources的用途,因此不会重新运行它。这意味着虽然target/classes包含最新的.class个文件,但它的文件已过时.java

如果您需要将源文件实际放在target/classes中,请确保gwt:resources在IDE中每次更改资源时运行,或者将源直接复制到target/classes。 }目录是在你的pom中设置<resource>条目。