如何在没有jetty-restart的情况下加载已导入到scalate的已修改类?

时间:2011-03-11 07:45:28

标签: scala sbt hotswap jrebel scalate

我使用scalate作为我的视图模板,并使用sbt + jrebel。但我发现如果导入到scalate的类已被修改,我们必须重新启动jetty,否则可能会出现复杂错误。

代码非常简单:

web应用/ WEB-INF / web.xml中

<web-app version="2.5">
  <filter>
    <filter-name>TemplateEngineFilter</filter-name>
    <filter-class>org.fusesource.scalate.servlet.TemplateEngineFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>TemplateEngineFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>

的src /主/阶/ test.scala

package test

object A {
    def a() = "AAA"
}

web应用程序/ index.jade

- import test.A._
= a()

禁用jetty的自动重新加载

class TestProject(info: ProjectInfo) extends DefaultWebProject(info) {
    override val scanDirectories = Nil
}

然后启动码头:

> sbt
> jetty-run
> ~prepare-webapp

访问主页:

http://localhost:8080/

显示正确:

AAA

然后我将test.scala修改为:

package test

object A {
    def a() = "AAA#######"
}

再次访问页面,更正:

AAA#######

然后修改方法名称:

package test

object A {
    def b() = "AAA#######"
}

index.jade调用b()

- import test.A._
= b()

再次访问,显示错误:

Server Error: We're sorry, but something went wrong.
We've been notified about this issue and we'll take a look at it shortly.

从这个示例我们不知道哪里出错了,但在我的另一个项目中,我们可以看到原因:编译index.jade失败,找不到值b()

所以我必须重新启动jetty:

> jetty-restart

再次访问,一切顺利。

如何解决此问题,或者有没有其他方法可以在不重新启动的情况下使用scalate?


更新

经过近一周的尝试,我不得不放弃。我尝试了所有可以找到的解决方案,但是如果没有重新启动它仍然无法编译。

现在,我只运行没有jrebel的sbt,让jetty在修改类时重新加载webapp(不监视scalate视图)。现在,它需要3到5秒,这不会太长。

最后,感谢@James的帮助

2 个答案:

答案 0 :(得分:1)

请参阅answer

上的user list

答案 1 :(得分:0)

你在运行什么模式?我相信系统属性scalate.mode默认为源代码中的生产(https://github.com/scalate/scalate/blob/master/scalate-core/src/main/scala/org/fusesource/scalate/TemplateEngine。阶)