PlayFramework如何在运行时显示代码更改而无需重新部署和重新部署? 它是否在内部使用tomcat?如果没有,我是否可以将我的Spring应用程序放在它使用的服务器容器之上,并获得运行时更改的好处。
注意:我知道技术上可以用Tomcat做到这一点,但是,形成我所经历的,它是非常错误的,并且不能一直工作。有时,它甚至需要重新加载整个应用程序上下文(大约16秒),这是不合适的。
答案 0 :(得分:5)
正如Zenklys指出的那样,播放工作是检查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
答案 1 :(得分:3)
首先,仅在开发模式下运行时才会出现这种情况。在产品模式下,不再检测到更改。
据我所知,这是因为应用程序不是从.class文件运行而是从.java文件运行。通过观察这些文件的最后修改日期,Play可以检测何时重新/编译应用程序。
您正在寻找像JRebel这样的内容。
答案 2 :(得分:0)
播放!不使用Tomcat或任何其他Servlet容器。它运行在Netty之上,因此它并不真正遵循Java EE规范。但是,您可以将应用程序组装到war包中,以便部署在Jetty / Tomcat / you-name-it-server上。
我可能错了,但是玩!可能会使用一次性类加载器来加载新的类定义,这就是为什么它的重载机制比常规hotswap更好的原因。
答案 3 :(得分:-2)
如果您使用JBoss在Eclipse中运行,则可以将JBoss部署目录指向本地项目。只要您不更改注射或方法签名,您就可以进行代码更改,并且可以在75%的时间内识别它们。由于JBoss使用Tomcat作为servlet容器,因此可以以相同的方式设置Tomcat。
Jrebel也专门用于此目的。