2011-09-04 13 views
5

Chcę ponownie wczytać szablon prędkości, ponieważ został zmieniony. W tym celu ustawiłem następujące elementy, ale ponowne ładowanie nie działa, gdy ręcznie zmieniam plik .vm wewnątrz META-INF/template/.Automatyczne ładowanie szablonu prędkości nie działa

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

Każdy pomysł? Oto moja velocityEngine fasola

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

Odpowiedz

6

Jak setResourceLoaderPathdoc mówi:

Zauważ, że buforowanie zasób zostanie włączona w każdym przypadku. Przy pomocy modułu ładującego pliki, ostatnio zmodyfikowany znacznik czasu będzie sprawdzany pod kątem dostępu do wykrywania zmian. Z SpringResourceLoader, zasób będzie buforowany na zawsze (na przykład dla zasobów ścieżek klas).

...

Aby wymusić użycie SpringResourceLoader, to znaczy, aby nie rozwiązywać ścieżkę jako zasób systemu plików w każdym przypadku, wyłącz flagę „preferFileSystemAccess”. Zobacz szczegóły na ten javadoc tego ostatniego.

Wtedy dla setPreferFileSystemAccess

Określ, czy preferują dostęp do systemu plików dla szablonu załadunku. Dostęp do systemu plików umożliwia szybkie wykrywanie zmian w szablonach.

Jeśli ta opcja jest włączona, VelocityEngineFactory spróbuje rozwiązać podaną "resourceLoaderPath" jako zasób systemu plików (który będzie działał również dla rozszerzonych zasobów ścieżek klas i zasobów ServletContext).

Domyślnym ustawieniem jest "true". Wyłącz tę opcję, aby zawsze ładować za pomocą SpringResourceLoader (tj. Jako strumień, bez gorącego wykrywania zmian w szablonach), co może być konieczne, jeśli niektóre szablony znajdują się w rozszerzonym katalogu klas, podczas gdy inne znajdują się w plikach jar.

Wygląda na to, że jest kilka rzeczy, które przyczyniają się do problemu. Korzystanie z pseudokrotnego protokołu SpringResourceLoader zpowoduje, że Spring buforuje szablon w nieskończoność. Oprócz tego wyłączone jest preferFileSystemAccess, co zapewnia, że ​​szablon nigdy nie będzie dostępny za pośrednictwem systemu plików.

+0

Tak, wygląda na to, że SpringResourceLoader zawsze buforuje. Mogłem wyłączyć buforowanie tylko przy użyciu innego modułu ładującego zasoby, takiego jak org.apache.velocity.runtime.resource.loader.FileResourceLoader. Dzięki. – Mohsen

1

Ok, mam velocityEngine fasoli ustawiony tak:

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

(zakładając że używasz Spring Framework, nawiasem mówiąc) i nie mam żadnych problemów z buforowaniem ogóle. Ale używam komponentu bean komendy zamiast beanfactory. Spójrz na to.

I jest coś, to trywialne, ale mimo to ..., czy rzeczywiście zmieniasz swój projekt po modyfikacji szablonu?

+0

Nie używam prędkości jako generatora widoku. Jest to po prostu używane jako szablon do generowania treści tekstowych. Tak, po sprawdzeniu plik jest automatycznie ponownie wdrażany do tomcat i powinien być widoczny dla serwera aplikacji. – Mohsen

2

Dodawanie nieruchomość rozwiązać ten problem dla mnie:

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

miałem ten sam problem przy użyciu właściwości poniżej ale dodanie powyższą właściwość pozwoliła mi dostać auto-reload pracować:

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

proszę zobaczyć How to edit a velocimacro without restarting velocity?

0

miałem ten sam problem w przeszłości, więc pisałem tego wpisu: Spring-mvc + Velocity + DCEVM

Głównym pomysłem jest użycie tego przynajmniej raz rozwój:

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 

Odkryłam, że to działa lepiej niż SpringResourceLoader bo teraz w moich szablonów mogę mieć obejmuje takie jak:

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

Gdzie ścieżka nagłówka znajduje się w /WEB-INF/views/header.vm

Powiązane problemy