20

我很好奇有人知道 Grails 或 Play 等框架如何检测代码中的更改并自动触发重新编译而不重新启动应用服务器的详细信息吗?是否有特定于 Groovy 的编译器或其动态特性的东西可以很容易地发生这种情况?

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

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

编辑:我应该澄清一下,我并不想构建一个 Grails 插件,而是要了解在 servlet 容器中的任何应用程序中执行此操作需要什么。即,我使用的是 Groovy 而不是 Grails。

Edit2:听起来 Play 有一个特定的 DEV 模式,可以实现这种热重载:http ://www.playframework.org/documentation/1.1.1/main#lifecycle

我知道 JRebel 通过类加载器执行复杂的类版本控制,但我假设像 Grails 或 Play 这样的 Web 框架没有将它提升到那个级别。

4

1 回答 1

13

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

看看下面的类,Play 使用它在运行时执行必要的编译。

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

另外,请注意 Play 中 DEV 模式和 PROD 模式之间的区别。这是 Play 开发人员做出的设计决定,一旦应用程序进入生产模式,这些类会在服务器启动时编译,并且不会检查热重载。这是有道理的,因为在 PROD 模式下,您的代码不应该真正改变。

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

于 2011-03-08T22:00:18.690 回答