一尘不染

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

java

我很好奇,是否有人知道Grails或Play这样的框架如何检测代码更改并自动触发重新编译而无需重新启动应用程序服务器的详细信息?Groovy的编译器是否具有某些特定功能,或者它的动态特性使这种操作很容易实现?

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

在此先感谢您提供任何指针,即使我必须仔细检查代码才能获得更大的图像。

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

Edit2:
听起来Play具有特定的DEV模式,可以启用此热重载:http
:
//www.playframework.org/documentation/1.1.1/main#lifecycle

我知道JRebel通过类加载器执行精心设计的类版本控制,但是我假设Grails或Play这样的Web框架并没有达到这一水平。


阅读 184

收藏
2020-12-03

共1个答案

一尘不染

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

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

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

另外,仅需注意播放中DEV模式和PROD模式之间的区别。这是Play开发人员的一项设计决定,即一旦应用程序进入生产模式,服务器启动时便会编译类,并且不会检查它们是否进行热重装。这是有道理的,因为在PROD模式下,您的代码实际上不应更改。

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

2020-12-03