6

我被介绍到 Play 框架,我发现其中一件令人惊奇的事情是不需要编译项目。您只需要保存编辑的文件并重新加载网页。

我被告知 Java 源代码被编译为字节码,然后使用 JIT 编译器进行编译,那么 Play 框架内部的魔力是什么?

4

3 回答 3

11

在 DEV 模式下运行时,Play 通过检查 java 文件的最后修改日期,并将它们与运行时生成的 .class 文件交叉引用来工作。如果它发现某些东西发生了变化,那么它会在运行时重新编译它们。

在 Play 1.x 中 - 使用 eclipse jdt 编译器 (org.eclipse.jdt.internal.compiler.Compiler) 完成重新编译。如果您想查看 Play 1.x 中的代码,只需查看以下类 - https://github.com/playframework/play/blob/master/framework/src/play/classloading/ApplicationCompiler.java

在 Play 2.x 中,Play 似乎是通过与 SBT 工具互连来实现的。看看这个 - https://github.com/playframework/Play20/blob/master/framework/src/play/src/main/scala/play/core/system/ApplicationProvider.scala

于 2012-07-29T07:10:05.030 回答
4

尽管您没有用最简单的语言提到哪个版本的 Play 让您如此惊讶,但可以这样描述:Play indevelopment mode监视属于您的应用程序的所有文件,如果有任何更改,它会重新编译所需的部分。因此 DEV 不应该用于生产 - 因为它是性能的冗余损失。否则:当您在生产模式下启动应用程序时,它将避免立即重新编译,但会获得性能。

在 Play 2 运行应用程序是开发模式完成

play run

或者

play ~run

(第一个命令在下一页命中后重新编译代码,第二个在下一个文件更改后)

在生产模式下运行应用程序可以完成

play start
于 2012-07-28T22:12:15.040 回答
1

如果您谈论的是 Play framework 1.x,它有一个应用程序类管理器,它会自动加载 java 源文件并将其编译为字节码(使用 Eclipse Java Compiler),此外它还会使用 Javassist 增强编译后的代码。检查https://github.com/playframework/play/tree/master/framework/src/play/classloading中的代码。

于 2012-07-28T22:09:24.850 回答