Grails 或 Play 如何检测更改和热重载类?

2022-09-02 10:48:09

我很好奇有没有人知道像Grails或Play这样的框架如何检测代码中的更改并自动触发重新编译而无需重新启动应用程序服务器的细节?是否有一些特定于Groovy编译器或其动态特性的东西可以很容易地实现这一点?

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

提前感谢任何指针,即使我必须筛选代码才能获得更大的画面。

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

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

我知道JRebel通过classloaders执行复杂的类版本控制,但我假设像Grails或Play这样的Web框架并没有把它提升到那个水平。


答案 1

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 模式下,此过程非常高效,因为您将经常更改代码,并且即时反馈非常强大。


答案 2

推荐