Я использую scalate в качестве шаблонов представления и sbt + jrebel. Но я обнаружил, что если классы, импортированные для масштабирования, были изменены, нам нужно перезапустить пристань, иначе могут возникнуть сложные ошибки.
Код довольно прост:
веб-приложение/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"
}
веб-приложение/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.
Из этого примера мы не знаем, что не так, но в моем другом проекте мы видим причину: Ошибка компиляции index.jade, значение b()
не найдено.
Поэтому мне нужно перезапустить причал:
> jetty-restart
Приходите снова, и все будет хорошо.
Как решить эту проблему, или есть ли другой способ работы с scalate без перезагрузки?
ОБНОВЛЕНИЕ
После почти 1 недели попыток я должен сдаться. Я перепробовал все решения, которые смог найти, но его по-прежнему нельзя скомпилировать без перезагрузки.
Теперь я просто запускаю sbt без jrebel и позволяю пристани перезагружать веб-приложение при изменении классов (не отслеживая масштабные представления). На данный момент это занимает от 3 до 5 секунд, что не так уж и много.
Наконец, спасибо за помощь @James