2011-09-04 60 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