Автоматическая перезагрузка шаблона Velocity не работает

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

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

Любая идея? Вот мой bean-компонент speedEngine

<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>

person Mohsen    schedule 04.09.2011    source источник


Ответы (4)


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

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

...

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

Тогда для setPreferFileSystemAccess

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

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

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

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

person serg    schedule 04.09.2011
comment
Да, кажется, что SpringResourceLoader всегда кеширует. Я смог отключить кеширование только с помощью другого загрузчика ресурсов, такого как org.apache.velocity.runtime.resource.loader.FileResourceLoader. Спасибо. - person Mohsen; 05.09.2011

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

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

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

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

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

person Edd    schedule 19.10.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), и у меня нет проблем с кэшированием. Но я использую bean-компонент конфигурации вместо beanfactory. Попробуйте разобраться в этом.

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

person Tomáš Plešek    schedule 04.09.2011
comment
Я не использую скорость как генератор представления. Это просто используется в качестве механизма шаблонов для генерации некоторого текстового контента. Да, как я проверил, файл автоматически переустанавливается на tomcat и должен быть виден серверу приложений. - person Mohsen; 04.09.2011

У меня была такая же проблема в прошлом, поэтому я написал эту запись в блоге: 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

person Rafael Sanches    schedule 10.02.2012