Автозагрузка шаблона скорости не работает - PullRequest
5 голосов
/ 04 сентября 2011

Я хочу перезагрузить шаблон скорости при его изменении. Для этого я установил следующее, но перезагрузка не работает, когда я вручную изменяю файл .vm внутри META-INF/template/.

velocimacro.library.autoreload = true
[spring|file|class].resource.loader.cache = false

Есть идеи? Вот моя скорость двигателя бин

<bean id="velocityEngine" class="org.springframework.ui.velocity.VelocityEngineFactoryBean">
    <property name="resourceLoaderPath" value="classpath:META-INF/template/" />
    <property name="preferFileSystemAccess" value="false" />
    <property name="velocityProperties">
        <props>
            <prop key="spring.resource.loader.cache">false</prop>
            <prop key="file.resource.loader.cache">false</prop>
            <prop key="class.resource.loader.cache">false</prop>
            <prop key="velocimacro.library.autoreload">true</prop>

            <prop key="resource.loader">spring</prop>
            <prop key="directive.foreach.counter.name">counter</prop>
            <prop key="directive.foreach.counter.initial.value">0</prop>
            <prop key="spring.resource.loader.class">
                org.springframework.ui.velocity.SpringResourceLoader
            </prop>
        </props>
    </property>
</bean>

Ответы [ 4 ]

6 голосов
/ 04 сентября 2011

Как setResourceLoaderPath doc говорит:

Обратите внимание, что кэширование ресурсов будет включено в любом случае.С загрузчиком файловых ресурсов, последняя измененная временная метка будет проверяться при доступе для обнаружения изменений. С SpringResourceLoader ресурс будет кэшироваться вечно (например, для ресурсов пути к классам).

...

Для принудительного использования SpringResourceLoader, т. Е. Чтобы не разрешатьпуть в качестве ресурса файловой системы, в любом случае, отключите флаг «Предпочитаемый файл системы».Подробности смотрите в javadoc последнего.

Тогда для setPreferFileSystemAccess

Установите, предпочитать ли доступ к файловой системе для загрузки шаблона. Доступ к файловой системе позволяет горячее обнаружение изменений шаблона.

Если это включено, VelocityEngineFactory попытается разрешить указанный «resourceLoaderPath» как ресурс файловой системы (который будет работать для ресурсов расширенного пути к классам)и ресурсы ServletContext тоже).

По умолчанию установлено значение "true". Отключите это, чтобы всегда загружать через SpringResourceLoader (то есть как поток, без горячего обнаружения изменений шаблона) , что может быть необходимо, если некоторые из ваших шаблонов находятся в каталоге расширенных классов, в то время как другие находятся в jar-файлах.

Похоже, есть несколько вещей, которые способствуют этой проблеме.Использование SpringResourceLoader с classpath: псевдопротоколом делает Spring кешировать шаблон бесконечно.Кроме того, preferFileSystemAccess отключен, что гарантирует, что шаблон никогда не будет доступен через файловую систему.

2 голосов
/ 19 октября 2011

Добавление этого свойства решило эту проблему для меня:

velocimacro.permissions.allow.inline.to.replace.global=true

У меня была такая же проблема при использовании свойств, указанных ниже, но добавление вышеуказанного свойства позволило мне выполнить автоматическую перезагрузку для работы:

velocimacro.library.autoreload=true
file.resource.loader.cache=false

См. Как редактировать velocimacro без перезапуска скорости?

1 голос
/ 04 сентября 2011

Хорошо, у меня установлен bean-компонент SpeedEngine следующим образом:

<bean id="velocityConfig" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">
        <property name="resourceLoaderPath" value="/templates/"/>
        <property name="velocityProperties">
            <props>
                <prop key="input.encoding">utf-8</prop>
             </props>
        </property>
</bean>
<bean id="viewResolver" class="org.springframework.web.servlet.view.velocity.VelocityViewResolver">
        <property name="cache" value="false"/>
        <property name="prefix" value=""/>
        <property name="suffix" value=".xhtml"/>
        <property name="contentType" value="text/html; charset=UTF-8" />
        <property name="exposeSpringMacroHelpers" value="true"/>
</bean>

(Кстати, если вы используете Spring Framework), и у меня нет проблем с кэшированием.Но я использую bean-компонент configurer вместо beanfactory.Попробуйте разобраться в этом.

И в том-то и дело, что это тривиально, но все же ..., вы на самом деле повторно развертываете свой проект после изменения шаблона?

0 голосов
/ 10 февраля 2012

У меня была такая же проблема в прошлом, поэтому я написал эту запись в блоге: Spring-mvc + Velocity + DCEVM

Основная идея состоит в том, чтобы использовать это по крайней меревремя разработки:

webapp.resource.loader.class = org.apache.velocity.tools.view.WebappResourceLoader
webapp.resource.loader.path = /WEB-INF/views/
webapp.resource.loader.cache = true
webapp.resource.loader.modificationCheckInterval = 2

Я обнаружил, что он работает лучше, чем SpringResourceLoader, потому что теперь в моих шаблонах я могу добавить, например:

#parse("/parts/header.vm")

Где путь заголовканаходится в /WEB-INF/views/header.vm

...