2011-09-04 18 views
5

Quiero volver a cargar la plantilla de velocidad a medida que se cambia. Para esto he establecido lo siguiente, pero la recarga no funciona cuando cambio manualmente un archivo .vm dentro de META-INF/template/.La recarga automática de Velocity Template no funciona

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

¿Alguna idea? Aquí está mi grano de 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> 

Respuesta

6

Como setResourceLoaderPathdoc dice:

Tenga en cuenta que el almacenamiento en caché de recursos será activada en cualquier caso. Con el cargador de recursos de archivos, la marca de tiempo del último cambio se verificará en el acceso para detectar cambios. Con SpringResourceLoader, el recurso se almacenará en caché para siempre (por ejemplo, para recursos de ruta de clase).

...

para hacer cumplir el uso de SpringResourceLoader, es decir, a no resolver un camino que los recursos del sistema de archivos en cualquier caso, desactive la bandera "preferFileSystemAccess". Vea el javadoc de este último para más detalles.

Luego de setPreferFileSystemAccess

definir si se prefiere el acceso al sistema de archivos para la carga de la plantilla. El acceso al sistema de archivos permite la detección en caliente de cambios en la plantilla.

Si esto está habilitado, VelocityEngineFactory intentará resolver el "resourceLoaderPath" especificado como recurso de sistema de archivos (que también funcionará para recursos de ruta de clase expandidos y recursos de ServletContext).

El valor predeterminado es "verdadero". Desactive esta opción para cargar siempre a través de SpringResourceLoader (es decir, como secuencia, sin detección activa de cambios de plantilla), que podría ser necesario si algunas de sus plantillas residen en un directorio de clases expandido mientras que otras residen en archivos jar.

Parece que hay algunas cosas que contribuyen al problema. El uso de SpringResourceLoader con classpath: pseudo-protocolo hace que Spring guarde en caché la plantilla infinitamente. Además de eso, el preferFileSystemAccess está desactivado, lo que asegura que nunca se acceda a esa plantilla a través del sistema de archivos.

+0

Sí, parece que SpringResourceLoader siempre se almacena en caché. Solo pude desactivar el almacenamiento en caché utilizando otro cargador de recursos como org.apache.velocity.runtime.resource.loader.FileResourceLoader. Gracias. – Mohsen

1

bien, tengo frijol velocityEngine establecido así:

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

(suponiendo que el uso framework Spring, por cierto) y no tengo problemas con el almacenamiento en caché en absoluto. Pero utilizo el configurer bean en lugar de beanfactory. Intenta ver esto.

Y existe la cosa, es trivial, pero aún así ..., ¿realmente vuelve a implementar su proyecto después de modificar la plantilla?

+0

yo no uso la velocidad como generador de vista. Esto solo se usa como motor de plantilla para la generación de contenido de texto. Sí, cuando revisé, el archivo se redistribuye automáticamente a tomcat y debería estar visible para el servidor de la aplicación. – Mohsen

2

La adición de esta propiedad resuelto este problema para mí:

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

que tenían el mismo problema cuando se usan las propiedades a continuación, pero la adición de la propiedad anterior me permitió conseguir la auto-recarga para trabajar:

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

por favor, vea How to edit a velocimacro without restarting velocity?

0

tuve el mismo problema en el pasado, por lo que he escrito esta entrada de blog: Spring-mvc + Velocity + DCEVM

La idea principal es utilizar esto por lo menos en el tiempo de desarrollo:

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 

he encontrado que funciona mejor que el SpringResourceLoader porque ahora en mis plantillas puedo tener incluye como estos:

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

Cuando el camino de la cabecera se encuentra en /WEB-INF/views/header.vm

Cuestiones relacionadas