我使用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的帮助