2011-09-04 37 views
5

Tôi muốn tải lại mẫu vận tốc khi nó được thay đổi. Đối với điều này tôi đã thiết lập sau, nhưng tải lại không hoạt động khi tôi tự thay đổi một tập tin .vm bên trong META-INF/template/.Tự động tải lại mẫu vận tốc không hoạt động

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

Bất kỳ ý tưởng nào? Dưới đây là đậu velocityEngine tôi

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

Trả lời

6

Như setResourceLoaderPathdoc nói:

Lưu ý rằng bộ nhớ đệm tài nguyên sẽ được kích hoạt trong mọi trường hợp. Với trình tải tài nguyên tệp, dấu thời gian được sửa đổi lần cuối sẽ được kiểm tra trên truy cập để phát hiện các thay đổi. Với SpringResourceLoader, tài nguyên sẽ được lưu trữ vĩnh viễn (ví dụ cho tài nguyên đường dẫn lớp).

...

Để thực thi việc sử dụng SpringResourceLoader, ví dụ: để không giải quyết được một con đường như tài nguyên hệ thống tập tin trong mọi trường hợp, tắt "preferFileSystemAccess" cờ. Xem javadoc của sau để biết chi tiết.

Sau đó cho setPreferFileSystemAccess

Đặt liệu để thích truy cập hệ thống tập tin cho mẫu tải. Truy cập hệ thống tệp cho phép phát hiện các thay đổi mẫu.

Nếu điều này được kích hoạt, VelocityEngineFactory sẽ cố gắng giải quyết tài nguyên hệ thống tập tin "resourceLoaderPath" (sẽ làm việc cho tài nguyên đường dẫn lớp mở rộng và tài nguyên ServletContext).

Mặc định là "true". Tắt tính năng này để luôn tải qua SpringResourceLoader (ví dụ như luồng, không phát hiện thay đổi mẫu), có thể cần thiết nếu một số mẫu của bạn nằm trong thư mục lớp mở rộng trong khi các tệp khác nằm trong tệp jar.

Vì vậy, có vẻ như có một vài điều góp phần gây ra sự cố. Sử dụng SpringResourceLoader với classpath: giao thức giả làm cho Spring cache mẫu vô hạn. Trên hết, preferFileSystemAccess bị vô hiệu hóa, đảm bảo rằng mẫu không bao giờ được truy cập thông qua hệ thống tệp.

+0

Có, có vẻ như SpringResourceLoader luôn lưu trữ. Tôi chỉ có thể tắt bộ nhớ đệm bằng cách sử dụng trình tải tài nguyên khác chẳng hạn như org.apache.velocity.runtime.resource.loader.FileResourceLoader. Cảm ơn. – Mohsen

1

Ok, tôi có đậu velocityEngine thiết lập như thế này:

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

(Giả sử bạn sử dụng khuôn khổ mùa xuân, bằng cách này) và tôi không có vấn đề với bộ nhớ đệm nào. Nhưng tôi sử dụng bean cấu hình thay vì beanfactory. Hãy thử nhìn vào điều này.

Và có điều, nó tầm thường, nhưng vẫn ..., bạn có thực sự triển khai lại dự án của mình sau khi sửa đổi mẫu không?

+0

Tôi không sử dụng vận tốc làm trình tạo chế độ xem. Điều này chỉ được sử dụng làm công cụ tạo mẫu cho một số thế hệ nội dung văn bản. Có, như tôi đã kiểm tra các tập tin được tự động redeployed để tomcat và nên được hiển thị cho máy chủ ứng dụng. – Mohsen

2

Thêm khách sạn này giải quyết vấn đề này cho tôi:

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

tôi đã cùng một vấn đề khi sử dụng các thuộc tính dưới đây nhưng thêm tài sản trên giúp tôi có được tự động tải lại để làm việc:

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

Vui lòng xem How to edit a velocimacro without restarting velocity?

0

Tôi đã gặp vấn đề tương tự trong quá khứ, vì vậy tôi đã viết mục blog này: Spring-mvc + Velocity + DCEVM

Ý tưởng chủ yếu là sử dụng này ít nhất là ở thời gian phát triển:

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 

tôi đã tìm thấy rằng nó hoạt động tốt hơn so với SpringResourceLoader vì bây giờ trong các mẫu của tôi, tôi có thể có bao gồm như thế này:

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

Trường hợp đường dẫn của tiêu đề nằm trong /WEB-INF/views/header.vm

Các vấn đề liên quan