0

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

代码非常简单:

webapp/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/main/scala/test.scala

package test

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

webapp/index.jade

- import test.A._
= a()

禁用码头的自动重新加载

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.

从这个示例中我们不知道哪里错了,但是在我的另一个项目中,我们可以看到原因: Failed compile index.jade, value b()is not found

所以我必须重新启动码头:

> jetty-restart

再次访问,一切顺利。

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


更新

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

现在,我只是在没有 jrebel 的情况下运行 sbt,并在修改类时让码头重新加载 webapp(不监视缩放视图)。目前,它需要 3 到 5 秒,不算太长。

最后,感谢@James 的帮助

4

2 回答 2

1

查看用户列表上的答案

于 2011-03-11T11:29:03.070 回答
0

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

于 2011-03-11T11:08:22.610 回答