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

Posted

技术标签:

【中文标题】Grails 或 Play 如何检测更改和热重载类?【英文标题】:How do Grails or Play detect changes and hot reload classes? 【发布时间】:2011-07-10 18:00:12 【问题描述】:

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

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

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

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

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

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

【问题讨论】:

Luke Daley 有一篇很好的文章,介绍了如何为 Groovy 类进行热重载。它可能对你有用:ldaley.com/post/653190105/… 这里有一些关于 JRebel 如何以通用方式执行此操作的有趣细节。我假设 Grails 没有那么复杂! zeroturnaround.com/blog/… 我将@Codemwnci 的答案标记为解决方案,但如果有人对 Grails 有深入了解,我仍然很感兴趣。谢谢! 【参考方案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 模式下非常高效,因为您会经常更改代码,并且即时反馈非常强大。

【讨论】:

优秀。这很有趣。感谢您的链接和洞察力。 @Codemwnci 这种方法是否适用于类中的任何更改,例如方法签名或继承? 应该可以。它应该识别层次结构中的一个类已更改,并在后台相应地重新编译 不,它不一定更有效率。如果您依赖任何计算量大且计算量大的缓存,那么情况正好相反,这种重新加载类的方法会完全扼杀您的生产力,因为它会转储昂贵的缓存,并且每次更改源代码时都需要重新计算它。另一种方法是隔离计算量大的缓存并在单独的 JVM 中运行它,但这样做所需的重构通常非常昂贵。

以上是关于Grails 或 Play 如何检测更改和热重载类?的主要内容,如果未能解决你的问题,请参考以下文章

颤振热重载和热重启不起作用

如何解决flutter中的性能和热重载问题?

实时重载、热重载和热模块更换之间的概念区别是啥?

对于 Java 中的 RESTful 服务,JAX-RS 是不是比 Swing、Grails 或 Play 等 MVC 框架更好?

由搭建Vue.js了解webpack,vue-loader和热重载

由搭建Vue.js了解webpack,vue-loader和热重载