在 grails 应用程序中在运行时修改 groovy 代码

Posted

技术标签:

【中文标题】在 grails 应用程序中在运行时修改 groovy 代码【英文标题】:Modifying groovy code at runtime in grails application 【发布时间】:2011-02-15 04:29:16 【问题描述】:

当我使用嵌入式码头服务器(用于 grails 1.2 的 tomcat)运行我的 grails 应用程序时,我可以在运行时即时更改我的控制器、服务和其他 java 文件,而无需重新启动应用程序。为此,我如何在部署在 Tomcat(或任何服务器)上的应用程序上实现相同的功能。我观察到 webapps 下的爆炸 war 文件夹有 gsp 文件,但没有 groovy 文件。

【问题讨论】:

【参考方案1】:

完成 Eric 的回答后,您无法在生产环境中动态更改源代码。但是,如果您真的想实时修改您的代码,您可以:

    改groovy类,编译,替换炸开的war文件夹中的.class文件,重启tomcat(我知道,我知道,很痛苦但是不知道更好的办法) 对于 gsp 文件,有一个技巧。将以下属性添加到您的 Config.groovy 文件中:grails.gsp.enable.reload=true。这将允许您即时更改您的 gsp 文件。小心,因为它会损害性能。详情请见here

【讨论】:

【参考方案2】:

当您将应用程序打包为 WAR 时,Groovy 文件将编译为 Java 字节码(.class 文件)并包含在 WAR 中。由于内存泄漏,文件在运行时的热交换不适合生产使用。

【讨论】:

【参考方案3】:

permgen 问题是 Spring/Grails 特有的,还是在精简的 Tomcat/Groovlet 设置中同样适用?

在性能方面,已编译的 Groovy 文件与未编译的相比收益为零,对吗?编译步骤只是为了让 Java 和 Groovy 一起工作吗?

我希望在不久的将来,我们将拥有一个完全可重新加载的生产环境,该环境运行良好,并且没有内存泄漏。

Grails 和 Rails 都没有提供可行的生产重载选项(在 Grails 中要求迟早死掉),这似乎很愚蠢。 php 显然很慢,但数以百万计的 Apache/PHP 驱动的网站可以迅速向用户提供内容。如果我们不运营 Facebook,我们是否应该关心在 *Rails 训练营中被警告过的性能损失?

从外部看,持续的 Java permgen 问题似乎很荒谬,它无法解决吗?

【讨论】:

以上是关于在 grails 应用程序中在运行时修改 groovy 代码的主要内容,如果未能解决你的问题,请参考以下文章

intellij IDEA为啥运行时不编译grails或groovy了。

如何对 Grails 应用程序进行并发修改测试

Grails:运行ajax请求时用户注销

Grails 4:邮件插件在 Elastic Beanstalk 上运行时无法读取“密码”属性

如何调试 grails 运行时异常?

在本地主机上运行两个 grails 应用程序时如何解决跨域错误