2011-09-04 74 views
5

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

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

任何想法?这里是我的velocityEngine豆

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

回答

6

由于setResourceLoaderPathdoc说:

注意资源缓存在任何情况下启用。使用文件资源加载器时,将在访问时检查最后修改的时间戳以检测更改。 使用SpringResourceLoader,资源将永久缓存(例如,用于类路径资源)。

...

强制使用SpringResourceLoader,即不解决任何案件的文件系统资源的路径,关闭“preferFileSystemAccess”标志。有关详细信息,请参阅后者的javadoc。

那么对于setPreferFileSystemAccess

设置是否喜欢模板加载文件系统的访问。 文件系统访问启用对模板更改的热检测。

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

默认为“true”。 关闭它始终通过SpringResourceLoader加载(即作为流,没有热检测到模板更改),如果某些模板驻留在展开的类目录中,而其他模板驻留在jar文件中,则可能需要该模板。

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

+0

是的,SpringResourceLoader似乎总是缓存。我只能通过使用另一个资源加载器(如org.apache.velocity.runtime.resource.loader.FileResourceLoader)来关闭缓存。谢谢。 – Mohsen

1

好吧,我有velocityEngine豆这样设置:

<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。试着看看这个。

还有一件事情,它是微不足道的,但仍然...,你是否真的在修改模板后重新部署你的项目?

+0

我不使用速度作为视图生成器。这只是用作一些文本内容生成的模板引擎。是的,因为我检查文件是自动重新部署到Tomcat,应该可以看到应用程序服务器。 – Mohsen

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?

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