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