如何配置 mvn/Jrebel/wtp/gwt/eclipse 以顺畅地处理服务接口上的更改

How to configure mvn/Jrebel/wtp/gwt/eclipse to work smoothly with changes on the service interface

我开始使用 Thomas Broyer 的新 maven gwt 插件研究 guice-rf-activities 工件。

我稍微玩了一下代码,在服务器端的 GreetingService 上添加了一个函数。我沿着路径添加了所需的位和字节,直到代码正确调用 greetServerinsultServer 方法。

我发现,简单的 SDM 重新编译并不能使该方法在服务器上可用。重新启动 Tomcat 也无济于事。在 eclipse 中保存文件没有正确触发编译。

最后,运行编译完整的模块成功了。

我认为这是一个问题,因为对服务的任何更改都可能让您有时间在大型项目上喝杯咖啡。是不是有一些"trick",我没有做,或者RequestFactory代码生成的复杂性那么重,我不能简单地使用SDM + JRebel或服务器重启来更改服务接口?

更新: Thomas 描述的方法(谢谢!)有效,如果你打算用 Maven tomcat 目标启动你的 tomcat。

更新 2: 描述了 launcherDir 将 wtp/eclipse/mvn/Jrebel 变为 运行 的方法。

如果你想像我一样使用 eclipse wtp tomcat 启动器和 JRebel 来动态编译你的服务器-classes,JRebel 重新加载将不会捕捉到被使用的射频服务名称。
要解决此问题,请将以下 JVM 属性添加到您的 wtp 启动配置(感谢 Thomas!):

-Dgwt.rf.ServiceLayerCache=false

当服务器界面发生变化时,会发生以下情况
(eclipse Luna 服务版本 2 (4.4.2),JRebel 6.x):

将 gwt 客户端代码与 wtp 服务器链接

要link带有wtp环境的代码服务器,src/main/webapp文件夹需要包含你的GWT代码文件夹。 为此,必须指示代码服务器在正确的位置生成 SDM 存根。将 属性 添加到 module/pom.xml 中:

<properties>    
    <gwt.launcherDir>${project.build.directory}/gwt/launcherDir</gwt.launcherDir>
</properties>

此外,将 gwt maven 插件配置为使用 属性:

<build>
  <plugins>
    <plugin>
      <groupId>net.ltgt.gwt.maven</groupId>
      <artifactId>gwt-maven-plugin</artifactId>
      <inherited>false</inherited>
      <configuration>
        <launcherDir>${gwt.launcherDir}</launcherDir>
      </configuration>
    </plugin>
  </plugins>
  ...

到 运行 eclipse 或命令行中的代码服务器,将 gwt.launcherDir 的正确定义提供给 maven。我正在使用 运行 eclipse 代码服务器的小命令:

mvn -Dgwt.launcherDir=module-app-server\src\main\webapp gwt:codeserver

这样,"recompile on f5" 工作起来非常顺畅。这就是GWT 在eclipse 中与maven 和JRebel 的最终集成。哇。感谢@TBroyer :-)

客户端不需要任何特殊的东西。服务器端虽然需要 RequestFactory 及其所有 RequestContext 和代理层次结构由 验证工具 .

处理

从命令行,在原型的上下文中,这意味着在 *-server 模块上启动 process-classes 阶段,例如

mvn process-classes -pl *-server -am

使用 mvn tomcat7:run -Denv=dev 运行ning,Tomcat 应该检测到 class 更改并自动重新加载 webapp。

然后在浏览器中刷新页面,再次验证后(重新加载Tomcat中的webapp丢失session/authentication)你可以看到端到端的变化。

重现步骤:

  1. 创建项目
  2. 在一个终端中,启动 mvn gwt:codeserver -pl *-client -am
  3. 在另一个终端,启动mvn tomcat7:run -pl *-server -am -Denv=dev
  4. 在浏览器中打开 http://localhost:8080,登录到 Web 应用程序并注意客户端应用程序自动编译(这是 GWT 2.7 中的新 SDM)
  5. 编辑 *-shared/src/main/java/**/GreetingContext.java 并将 greetServer 复制为 insultServer
  6. 类似地,编辑 *-server/src/main/java/**/GreetingService.java 并复制 greetServerinsultServer(将 Hello 消息更改为侮辱以感受更改)
  7. 编辑 *-client/src/main/java/**/GreetingActivity.java 并将对 greetServer 的调用替换为对 insultServer 的调用(或添加另一个按钮并复制代码)
  8. 在另一个终端中,运行 mvn process-classes -pl *-server -am;注意 Tomcat 重新加载 webapp
  9. 在浏览器中刷新页面,重新登录,注意客户端应用程序正在重新编译。按下按钮并受到侮辱而不是受到欢迎。 QED.

验证工具可以在您的IDE中配置为注解处理器;有关详细信息,请参阅 https://code.google.com/p/google-web-toolkit/wiki/RequestFactoryInterfaceValidation。请注意,Eclipse 在注释处理方面是出了名的糟糕(损坏?); not 运行 处理器 在编辑器中 可能更好,因为他们称之为(即增量),而是触发项目构建完成后(希望这应该等同于 mvn process-classes),或者您可以从 Eclipse 中启动 mvn process-classes

请注意,我建议不要从 Eclipse 中启动 mvn gwt:codeservermvn tomcat7:run,因为 Eclipse 会硬杀死进程,这通常会导致 CodeServer 保持活动状态(这是一个分叉进程),并且不会 运行 您的 JVM 关闭挂钩或 ServletContextListenercontextDestroyed.