2011-09-04 15 views
5

मैं बदल गया है क्योंकि वेग टेम्पलेट को फिर से लोड करना चाहता हूं। इसके लिए मैंने अनुवर्ती सेट सेट की हैं, लेकिन जब मैं मैन्युअल रूप से META-INF/template/ के अंदर .vm फ़ाइल बदलता हूं तो पुनः लोड नहीं होता है।वेग टेम्पलेट ऑटो-रीलोड काम नहीं करता

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

कोई विचार?

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

(मान लें कि आप, स्प्रिंग ढांचे का उपयोग माध्यम से) और मैं जो भी कैशिंग के साथ कोई समस्या नहीं: यहाँ मेरी 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

setResourceLoaderPath रूप doc का कहना है:

ध्यान दें कि संसाधन कैशिंग किसी भी मामले में सक्षम हो जाएगा। फ़ाइल संसाधन लोडर के साथ, अंतिम-संशोधित टाइमस्टैम्प को परिवर्तनों का पता लगाने के लिए उपयोग पर चेक किया जाएगा। SpringResourceLoader के साथ, संसाधन हमेशा के लिए कैश किया जाएगा (उदाहरण के लिए कक्षा पथ संसाधनों के लिए)।

...

SpringResourceLoader का उपयोग करते हैं, अर्थात किसी भी मामले में फाइल सिस्टम संसाधन के रूप में एक पथ नहीं सुलझा को लागू करने के लिए, "preferFileSystemAccess" झंडा बंद कर देते हैं। विवरण के लिए बाद के जावाडोक देखें।

फिर setPreferFileSystemAccess

के लिए सेट टेम्पलेट लोड करने के लिए फाइल सिस्टम का उपयोग पसंद करते हैं या नहीं। फ़ाइल सिस्टम एक्सेस टेम्पलेट परिवर्तनों की गर्म पहचान को सक्षम बनाता है।

यदि यह सक्षम है, तो VelocityEngineFactory निर्दिष्ट "संसाधन लोडरपाथ" को फ़ाइल सिस्टम संसाधन के रूप में हल करने का प्रयास करेगा (जो विस्तारित वर्ग पथ संसाधनों और ServletContext संसाधनों के लिए भी काम करेगा)।

डिफ़ॉल्ट "सत्य" है। स्प्रिंग रिसोर्सलोडर (यानी स्ट्रीम के रूप में, टेम्पलेट परिवर्तनों के गर्म पहचान के बिना स्ट्रीम के रूप में हमेशा लोड करने के लिए इसे बंद करें), यदि आपके कुछ टेम्पलेट्स विस्तारित कक्षा निर्देशिका में रहते हैं, जबकि अन्य जार फ़ाइलों में रहते हैं तो यह आवश्यक हो सकता है।

ऐसा लगता है कि समस्या में योगदान देने वाली कुछ चीजें हैं। SpringResourceLoader का उपयोग classpath: छद्म-प्रोटोकॉल स्प्रिंग कैश टेम्पलेट को अनंत काल बनाता है। उस preferFileSystemAccess के शीर्ष पर अक्षम है जो सुनिश्चित करता है कि फ़ाइल सिस्टम के माध्यम से कभी भी टेम्पलेट का उपयोग नहीं किया जाता है।

+0

हां, ऐसा लगता है कि SpringResourceLoader हमेशा कैश करता है। मैं केवल org.apache.velocity.runtime.resource.loader.FileResourceLoader जैसे किसी अन्य संसाधन लोडर का उपयोग करके कैशिंग को बंद करने में सक्षम था। धन्यवाद। – Mohsen

1

ठीक है मैं velocityEngine सेम इस तरह निर्धारित किया है है। लेकिन मैं beanfactory के बजाय कॉन्फ़िगरर बीन का उपयोग करें। इसे देखने का प्रयास करें।

और यह बात है, यह मामूली है, लेकिन फिर भी ..., क्या आप वास्तव में टेम्पलेट को संशोधित करने के बाद अपनी परियोजना को फिर से तैनात करते हैं?

+0

में है मैं दृश्य जनरेटर के रूप में वेग का उपयोग नहीं करते। यह सिर्फ कुछ पाठ सामग्री पीढ़ी के लिए टेम्पलेट इंजन के रूप में प्रयोग किया जाता है। हां, जैसा कि मैंने फ़ाइल की जांच की है स्वचालित रूप से टोमकैट पर फिर से तैनात किया गया है और एप्लिकेशन सर्वर के लिए दृश्यमान होना चाहिए। – 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

संबंधित मुद्दे