我通过代理运行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>
答案 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>
条目。