Как загрузить модифицированные классы, которые были импортированы для масштабирования без перезапуска причала?

Я использую 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


person Freewind    schedule 11.03.2011    source источник


Ответы (2)


См. ответ на странице список пользователей

person James Strachan    schedule 11.03.2011
comment
Вообще говоря, на связанные ответы смотрят свысока. Это во многом зависит от того, насколько мы можем доверять ссылке, чтобы она оставалась действительной в течение многих лет. - person Daniel C. Sobral; 12.03.2011

В каком режиме вы работаете? Я считаю, что системное свойство scalate.mode по умолчанию используется в исходном коде (https://github.com/scalate/scalate/blob/master/scalate-core/src/main/scala/org/fusesource/scalate/TemplateEngine. Скала)

person thoredge    schedule 11.03.2011