Velocity Template自动重载不起作用

时间:2011-09-04 09:50:22

标签: java spring macros velocity

我想重新加载速度模板,因为它已经改变了。为此,我设置了以下内容,但是当我在META-INF/template/内手动更改.vm文件时重新加载不起作用。

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

有什么想法吗?这是我的velocityEngine bean

<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 个答案:

答案 0 :(得分:6)

正如setResourceLoaderPath doc所说:

  

请注意,无论如何都将启用资源缓存。使用文件资源加载器,将在访问时检查上次修改的时间戳以检测更改。 使用SpringResourceLoader,资源将永久缓存(例如,对于类路径资源)。

     

...

     

要强制使用SpringResourceLoader,即在任何情况下都不将路径解析为文件系统资源,请关闭“preferFileSystemAccess”标志。有关详细信息,请参阅后者的javadoc。

然后是setPreferFileSystemAccess

  

设置是否更喜欢文件系统访问以进行模板加载。 文件系统访问可以热检测模板更改。

     

如果启用此选项,VelocityEngineFactory将尝试将指定的“resourceLoaderPath”解析为文件系统资源(这也适用于扩展的类路径资源和ServletContext资源)。

     

默认为“true”。 将其关闭以始终通过SpringResourceLoader加载(即作为流,无需热模板更改检测),如果某些模板驻留在扩展类目录中而其他模板驻留在jar文件中,则可能需要这样做。

所以看起来有一些事情会导致这个问题。使用SpringResourceLoaderclasspath:伪协议使Spring无限地缓存模板。最重要的是preferFileSystemAccess被禁用,这确保永远不会通过文件系统访问模板。

答案 1 :(得分:2)

添加此属性可以解决此问题:

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

使用下面的属性时遇到了同样的问题,但添加上面的属性使我能够自动重新加载:

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

请参阅How to edit a velocimacro without restarting velocity?

答案 2 :(得分:1)

好的,我的velocityEngine bean设置如下:

<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框架,顺便说一下) 我没有任何缓存问题。但我使用configurer bean而不是beanfactory。试着调查一下。

而且有一些事情,这是微不足道的,但仍然......,您是否在修改模板后重新部署项目?

答案 3 :(得分:0)

我过去遇到过同样的问题,所以我写了这篇博文: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