3

据我所知,Ruby 或 Python 等动态语言相对于 Java/Scala/C# 等的主要优势是将您对源代码的更改“热”应用于正在运行的应用程序。支持相同工作流的 JVM 或 .NET 框架有哪些 - 动态地对配置和源代码应用更改?他们还可以观察自定义配置的变化并通知应用程序吗?

注意: JVM/.NET 上的动态语言框架(如 Grails 或 Compojure)不在此范围内。

编辑:我的意思不仅是修改方法体,还包括添加/删除方法、字段和类。从完成编辑到观察浏览器更改之间的平均时间是多少?

不错的解决方案

4

4 回答 4

3

好问题!在 Java 世界中:

在所有 Java 框架中,JVM 热插拔功能允许您的调试器在适当的位置进行一些更改,但是您受到一些限制 - 例如:您不能更改类层次结构、添加方法等。

有一个商业产品JRebel,它宣传自己允许您动态地进行几乎任何代码更改 - 我自己从未能够让它正常工作,但您可能会有更好的运气。

除此之外,我知道GWT的开发模式允许任意更改而无需重新编译,如果 GWT 没有该功能,我认为 GWT 不会成为直接编写 javascript 的可行竞争对手。但是,请记住,GWT 不是传统的 Web 框架,它都运行在客户端。

最后,还有服务器端的Play框架,当你刷新浏览器时,它也会自动重新加载带有任意变化的 java 类。

于 2010-04-10T16:44:03.467 回答
1

我已经将LiftJRebel一起使用,没有问题。您只需正确配置它,在一个终端中启动 Web 服务器,并使用maven scala::cc. 这将自动重新编译所有内容(如果您使用此处的配置,则所有必要的内容),并且 JRebel 将立即使更改在 Web 服务器上可用。

于 2010-04-12T01:06:38.797 回答
0

用于 Java servlet 的 Apache Tomcat 服务器具有“监视”资源的配置选项。如果监视的 servlet 或 Web 应用程序发生更改(即,将新代码上传到服务器),Tomcat 会自动重新加载它。

根据我的经验,当与其他高级功能(例如,用户目录)混合时,此功能有些损坏,但在其他方面如宣传的那样工作。

于 2010-04-10T15:48:16.970 回答
0

你不需要一个框架。当您从 eclipse 运行 Java 应用程序并修改源代码时,eclipse 将尝试将新代码修补到正在运行的 VM 中。如果被替换的方法当前正在执行,这甚至可以工作(在这种情况下,方法执行将在方法的开头重新开始)。某些更改无法热部署,例如删除公共方法或更改子类型关系。

当然,如果您的应用程序缓存了一些东西(例如,在启动期间设置读取),则不会重新计算这些缓存,尽管您可能可以在调试器中手动调用解析方法。

于 2010-04-10T15:54:15.093 回答