gwt托管模式如何观察变化?
我通过代理运行gwt托管模式; 调试工作,但它不会改变我在IDE中创建的客户端代码。
我正在使用Maven插件启动托管模式; 配置如下。 webapp代码位于/ web中的原因是该应用程序基于dropwizard,该dropwizard无法将网络资产从根目录中提取出来; 因此我有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>
多步骤答案,首先回答题目,然后解释你的应用程序为什么不行为:
在开发模式下调试GWT应用程序时,页面启动hosted.html
文件,该文件连接到浏览器插件,然后尝试读取在默认情况下运行的代码服务器localhost:9997。 在建立连接时,dev模式会查找模块文件,并使事情顺利进行。 自定义类加载器'CompilingClassLoader'被dev模式用于执行所需的其他工作:
在启动时,需要找到所有JavaScriptObject
类并将其合并为一个巨型类型JavaScriptObject$
,以便您可以从一个JSO自由地投射到另一个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自己的编译器会更新target/classes
的.class文件,但不知道gwt:resources
的用途,因此不会重新运行它。 这意味着尽管target/classes
具有最新的.class
文件,但它具有过时的.java
文件。
如果你需要你的源文件实际上处于target/classes
,那么要么确保gwt:resources
在IDE中每次更改gwt:resources
运行,要么将源直接复制到target/classes
目录的另一种方法是设置一个<resource>
入你的朋友。