2011-09-04 16 views
5

Desidero ricaricare il modello velocità mentre è cambiato. Per questo ho impostato quanto segue, ma la ricarica non funziona quando cambio manualmente un file .vm all'interno di META-INF/template/.Velocity Template auto-reload non funziona

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

Qualche idea? Ecco il mio velocityEngine fagioli

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

risposta

6

Come setResourceLoaderPathdoc dice:

Si noti che la cache delle risorse sarà abilitata in ogni caso. Con il caricatore di risorse del file, il timestamp dell'ultima modifica verrà controllato all'accesso per rilevare le modifiche. Con SpringResourceLoader, la risorsa verrà memorizzata nella cache per sempre (ad esempio per le risorse del percorso classe).

...

Per imporre l'utilizzo di SpringResourceLoader, vale a dire di non risolvere un percorso come risorsa del file system, in ogni caso, spegnere il flag "preferFileSystemAccess". Vedi il javadoc di quest'ultimo per i dettagli.

Poi per setPreferFileSystemAccess

Impostare se preferiscono accesso al file system per il modello di carico. L'accesso al file system consente il rilevamento a caldo delle modifiche del modello.

Se questa opzione è abilitata, VelocityEngineFactory cercherà di risolvere la "resourceLoaderPath" specificato come risorsa del file system (che lavorerà per le risorse percorso di classe espanse e risorse ServletContext troppo).

L'impostazione predefinita è "true". Spegnere questa opzione per caricare sempre SpringResourceLoader (vale a dire come flusso, senza rilevamento a caldo delle modifiche del modello), che potrebbe essere necessario se alcuni dei modelli risiedono in una directory di classi espanse mentre altri risiedono in file jar.

Quindi sembra che ci siano alcune cose che contribuiscono al problema. L'utilizzo di SpringResourceLoader con lo pseudo-protocollo classpath: rende Spring cache il modello infinitamente. Inoltre, preferFileSystemAccess è disabilitato e questo assicura che il modello non acceda mai al modello.

+0

Sì, sembra che SpringResourceLoader memorizzi sempre nella cache. Sono stato in grado di disattivare la memorizzazione nella cache solo utilizzando un altro caricatore di risorse come org.apache.velocity.runtime.resource.loader.FileResourceLoader. Grazie. – Mohsen

1

Ok, ho velocityEngine fagioli impostato in questo modo:

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

(a patto di utilizzare framework Spring, tra l'altro) e non ho problemi con la cache di sorta. Ma io uso il bean di configurazione invece di beanfactory. Prova a guardare in questo.

E c'è il problema, è banale, ma ancora ..., in realtà si ridistribuisce il progetto dopo aver modificato il modello?

+0

non uso velocità come generatore vista. Questo è solo usato come motore di template per la generazione di contenuti testuali. Sì, come ho verificato il file viene automaticamente ridistribuito a Tomcat e dovrebbe essere visibile al server delle applicazioni. – Mohsen

2

Aggiungendo questa proprietà risolto questo problema per me:

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

Ho avuto lo stesso problema quando si utilizza le proprietà di sotto ma aggiungendo la proprietà di cui sopra mi ha permesso di ottenere l'auto-ricarica a lavorare:

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

vedere How to edit a velocimacro without restarting velocity?

0

ho avuto lo stesso problema in passato, così ho scritto questo blog: Spring-mvc + Velocity + DCEVM

L'idea principale è quella di utilizzare questo, almeno in fase di sviluppo:

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 

ho trovato che funziona meglio del SpringResourceLoader perché ora nei miei modelli posso avere comprende come questi:

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

Qualora il percorso dell'intestazione è /WEB-INF/views/header.vm

Problemi correlati