如何配置 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
上添加了一个函数。我沿着路径添加了所需的位和字节,直到代码正确调用 greetServer
或 insultServer
方法。
我发现,简单的 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):
- 根据需要更改您的服务和环境 classes
- 你看到 JRebel 正在重新加载 class
- 在命令行调用
mvn process-classes
- 您看到 JRebel 正在重新加载混淆工厂
- SDM 在浏览器中编译(F5 即可)
- 您的服务现已在客户端运行
将 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)你可以看到端到端的变化。
重现步骤:
- 创建项目
- 在一个终端中,启动
mvn gwt:codeserver -pl *-client -am
- 在另一个终端,启动
mvn tomcat7:run -pl *-server -am -Denv=dev
- 在浏览器中打开
http://localhost:8080
,登录到 Web 应用程序并注意客户端应用程序自动编译(这是 GWT 2.7 中的新 SDM)
- 编辑
*-shared/src/main/java/**/GreetingContext.java
并将 greetServer
复制为 insultServer
- 类似地,编辑
*-server/src/main/java/**/GreetingService.java
并复制 greetServer
和 insultServer
(将 Hello
消息更改为侮辱以感受更改)
- 编辑
*-client/src/main/java/**/GreetingActivity.java
并将对 greetServer
的调用替换为对 insultServer
的调用(或添加另一个按钮并复制代码)
- 在另一个终端中,运行
mvn process-classes -pl *-server -am
;注意 Tomcat 重新加载 webapp
- 在浏览器中刷新页面,重新登录,注意客户端应用程序正在重新编译。按下按钮并受到侮辱而不是受到欢迎。 QED.
验证工具可以在您的IDE中配置为注解处理器;有关详细信息,请参阅 https://code.google.com/p/google-web-toolkit/wiki/RequestFactoryInterfaceValidation。请注意,Eclipse 在注释处理方面是出了名的糟糕(损坏?); not 运行 处理器 在编辑器中 可能更好,因为他们称之为(即增量),而是触发项目构建完成后(希望这应该等同于 mvn process-classes
),或者您可以从 Eclipse 中启动 mvn process-classes
。
请注意,我建议不要从 Eclipse 中启动 mvn gwt:codeserver
和 mvn tomcat7:run
,因为 Eclipse 会硬杀死进程,这通常会导致 CodeServer
保持活动状态(这是一个分叉进程),并且不会 运行 您的 JVM 关闭挂钩或 ServletContextListener
的 contextDestroyed
.
我开始使用 Thomas Broyer 的新 maven gwt 插件研究 guice-rf-activities
工件。
我稍微玩了一下代码,在服务器端的 GreetingService
上添加了一个函数。我沿着路径添加了所需的位和字节,直到代码正确调用 greetServer
或 insultServer
方法。
我发现,简单的 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):
- 根据需要更改您的服务和环境 classes
- 你看到 JRebel 正在重新加载 class
- 在命令行调用
mvn process-classes
- 您看到 JRebel 正在重新加载混淆工厂
- SDM 在浏览器中编译(F5 即可)
- 您的服务现已在客户端运行
将 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)你可以看到端到端的变化。
重现步骤:
- 创建项目
- 在一个终端中,启动
mvn gwt:codeserver -pl *-client -am
- 在另一个终端,启动
mvn tomcat7:run -pl *-server -am -Denv=dev
- 在浏览器中打开
http://localhost:8080
,登录到 Web 应用程序并注意客户端应用程序自动编译(这是 GWT 2.7 中的新 SDM) - 编辑
*-shared/src/main/java/**/GreetingContext.java
并将greetServer
复制为insultServer
- 类似地,编辑
*-server/src/main/java/**/GreetingService.java
并复制greetServer
和insultServer
(将Hello
消息更改为侮辱以感受更改) - 编辑
*-client/src/main/java/**/GreetingActivity.java
并将对greetServer
的调用替换为对insultServer
的调用(或添加另一个按钮并复制代码) - 在另一个终端中,运行
mvn process-classes -pl *-server -am
;注意 Tomcat 重新加载 webapp - 在浏览器中刷新页面,重新登录,注意客户端应用程序正在重新编译。按下按钮并受到侮辱而不是受到欢迎。 QED.
验证工具可以在您的IDE中配置为注解处理器;有关详细信息,请参阅 https://code.google.com/p/google-web-toolkit/wiki/RequestFactoryInterfaceValidation。请注意,Eclipse 在注释处理方面是出了名的糟糕(损坏?); not 运行 处理器 在编辑器中 可能更好,因为他们称之为(即增量),而是触发项目构建完成后(希望这应该等同于 mvn process-classes
),或者您可以从 Eclipse 中启动 mvn process-classes
。
请注意,我建议不要从 Eclipse 中启动 mvn gwt:codeserver
和 mvn tomcat7:run
,因为 Eclipse 会硬杀死进程,这通常会导致 CodeServer
保持活动状态(这是一个分叉进程),并且不会 运行 您的 JVM 关闭挂钩或 ServletContextListener
的 contextDestroyed
.