当前位置: 首页 > 面试题库 >

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

狄高畅
2023-03-14
问题内容

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

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

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

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

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

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


问题答案:

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

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

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

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

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



 类似资料:
  • 是否有一种方法可以在每次文件更改时以某种方式触发一个事件?我是指类似的东西(在伪代码中) 我知道我可以周期性地做,但我能在没有计时器的情况下做吗?我希望在用户更新txt文件时(不是通过代码,而是通过打开文件并在里面写入)能够做出一些动作,但我不知道他什么时候会这么做。

  • 问题内容: 在Angular 1中,通过检查$ scope层次结构来进行更改检测。我们将在模板,控制器或组件中隐式或显式创建观察者。 在Angular 2中,我们不再具有$ scope,但是我们确实覆盖了setInterval,setTimeout等。我可以看到Angular如何使用它来触发$ digest,但是Angular如何确定发生了什么变化,特别是考虑到Object.observe从未进入

  • 我正在用ExoPlayer 2在Android上开发视频播放器 我正在寻找在SubtitleView(屏幕上部)中检测字幕更改的方法,以在TextView(屏幕下部)中自动滚动字幕<似乎没有听众这么做<我试了几个听众的字幕,但没有效果<你有什么想法吗

  • 问题内容: 如何轻松检测变量何时更改值?我希望每当指定变量更改值时,程序的执行就在调试器上中断。现在,我正在使用Eclipse的调试器。 问题答案: 对于类或实例变量 右键单击大纲视图中的变量 选择“切换监视点” 然后,在breapkoints视图中,可以右键单击结果条目 选择“断点属性” 取消选择“现场访问”。

  • "热重载"不是当你修改文件的时候简单重新加载页面。启用热重载后,当你修改 .vue 文件时,所有该组件的实例会被替换,并且不需要刷新页面。它甚至保持应用程序和被替换组件的当前状态!当你调整模版或者修改样式时,这极大的提高了开发体验。 状态保留规则 当编辑一个组件的 <template> 时,这个组件实例将就地重新渲染,并保留当前所有的私有状态。能够做到这一点是因为模板被编译成了新的无副作用的渲染函

  • 变化检测器的目标是知道从上一次变化检测过程运行以来,组件的模板中使用的哪些模型属性已经改变。 为了知道,Angular创建了一个适当的变化检测器类的实例和一个链接到它应该检查的组件。 在我们的示例中,因为我们只有一个和MovieComponent的实例,我们将只有一个MainComponent_ChangeDetector和MovieComponent_ChangeDetector的实例。 下面的