2011-03-07 57 views
20

我很好奇没有人知道Grails或Play等框架如何检测代码中的变化,并自动触发重新编译而无需重新启动应用程序服务器?有没有特定于Groovy的编译器或其动态特性的东西,使它容易发生?Grails或Play如何检测更改和热重载类?

对于背景,我在构建过程中有一个自定义的代码生成阶段,我希望能够具有类似的编辑和刷新功能。

预先感谢任何指针,即使我必须筛选代码以获取更大的图片。

编辑:我应该澄清一下,我不打算在servlet容器中的任何应用程序中完成这些操作,以致无法构建Grails插件。即,我正在使用Groovy,但不使用Grails。

EDIT2:这听起来像玩有一个特定的DEV模式,这使得这个炎热的重装:http://www.playframework.org/documentation/1.1.1/main#lifecycle

据我所知,JRebel的执行通过类加载器精心类的版本,但我假设Web框架Grails的一样或游戏没有把它带到那个水平。

+3

Luke Daley有一篇关于如何为Groovy类进行热重载的精彩文章。它可能对你有用:http://ldaley.com/post/653190105/putting-the-artefact-api-to-work-in-your-grails-app – Dana 2011-03-07 23:54:36

+0

这里有一些关于JRebel如何做到这一点的迷人细节一种通用的方式。我假设Grails不是那么复杂! http://www.zeroturnaround.com/blog/reloading_java_classes_401_hotswap_jrebel/ – mckamey 2011-03-08 02:54:57

+0

我将@ Codemwnci的答案标记为解决方案,但如果有人对Grails有深入了解,我仍然对此感兴趣。谢谢! – mckamey 2011-03-09 17:45:16

回答

13

使用Eclipse JDT在运行时进行编译代码。

看看下面这个类,它被Play用来在运行时执行必要的编译。

https://github.com/playframework/play/blob/master/framework/src/play/classloading/ApplicationCompiler.java

而且,只是要注意在播放的DEV模式和PROD模式之间的区别。这是由Play开发人员做出的设计决定,一旦应用程序进入Production模式,这些类将在服务器启动时编译,并且不会检查热重载。这是有道理的,因为在PROD模式下,你的代码不应该真的在改变。

在DEV模式下,每次收到新请求时都会检查Java文件的更新,并且所有更改的文件都会自动重新编译(并且错误直接显示在浏览器中)。这个过程在DEV模式下非常高效,因为您会经常更改代码,并且即时反馈非常强大。

+0

非常好。这非常有趣。感谢您的链接和见解。 – mckamey 2011-03-09 00:42:17

+0

@Codemwnci此方法是否适用于类中的任何更改,例如方法签名或继承? – 2012-12-16 07:14:33

+0

它应该这样做。它应该认识到层次结构中的一个类已经发生了变化,并在后台进行相应的重新编译。 – Codemwnci 2012-12-16 10:56:00