2012-08-27 13 views
5

में क्लोजर कोड को फिर से लोड करना मेरे पास एक मौजूदा जावा वेबैप टॉमकैट में चल रहा है जिसमें मैं कुछ आदिम क्लोजर समर्थन जोड़ रहा हूं। समय के लिए, मैं क्लोजर स्रोत फ़ाइलों को क्लासपाथ पर संसाधनों के रूप में शामिल कर रहा हूं और इसे clojure.lang.RT के माध्यम से आमंत्रित कर रहा हूं। यह आदिम है, लेकिन ठीक काम करता है।टॉमकैट

हालांकि, मैंने देखा है कि टॉमकैट के WebappClassLoader कैश संसाधन getResourceAsInputStream() के माध्यम से पुनर्प्राप्त किए गए हैं जो क्लोजर स्रोत कोड को पुनर्प्राप्त और संकलित करने के लिए उपयोग करता है। यही है, (require 'my-ns :reload) कर फ़ाइल के कैश किए गए संस्करण को फिर से लोड करता है भले ही एक अद्यतन एक डिस्क पर उपलब्ध हो। क्लोजर फाइलों के लिए इस कैशिंग को रोकने या टालने का कोई तरीका है?

सबसे अच्छा मैं बिना फलहीन googling के बाद आया है WebappClassLoader.resourceEntries से मैन्युअल रूप से प्रविष्टि को हटाने के लिए प्रतिबिंब का उपयोग करना है जो भयानक है।

मुझे कुछ याद आना चाहिए।

"जेटी/ग्लासफ़िश/जेबॉस" का उपयोग करें, "टॉमकैट को पुनरारंभ करें", आदि जो मैं ढूंढ रहा हूं वह नहीं हैं।

उत्तर

2

आप WebappClassLoader के व्यवहार को रोकने में सक्षम नहीं होंगे। आप क्या कर सकते हैं कोड को अपने अधिकार क्षेत्र के बाहर लोड किया जा रहा है; जैसे $CATALINA_HOME/lib तक, जैसा कि here वर्णित है।

आपको अपनी सभी निर्भरताओं को भी वहां स्थानांतरित करने की आवश्यकता होगी, जिसे आप वास्तव में एक वेबपैप के रूप में तैनात करते हैं, जिसे आप एक छोटे से खोल के रूप में तैनात करते हैं, जो सभी कोड पहले से कहीं और उपलब्ध होने की अपेक्षा करता है।

यह आपको WebappClassLoader के क्षेत्राधिकार से बाहर ले जाएगा, और उम्मीद है कि इसके अर्थशास्त्र भी। (यदि यह अभिभावक क्लासलोडर्स से लोड की गई चीज़ों को कैश करता है, तो यह पूरी तरह से टूटा हुआ IMO लगता है।)

+0

धन्यवाद चास। मुझे इसके बारे में सोचना होगा। 'Lib' में सामान डालना सुविधाजनक नहीं है। मुझे आश्चर्य है कि '* उपयोग-संदर्भ-क्लासलोडर *' को अन्य सामानों को खराब किए बिना कोई असर पड़ेगा। –

+0

@ डेवरे '* उपयोग-संदर्भ-श्रेणी लोडर *' डिफ़ॉल्ट रूप से सत्य है। इसे गलत पर सेट करने से क्लासलोडर के माध्यम से मार्गों में लोड हो सकता है जो क्लोजर स्वयं लोड करता है - जिसका कोई प्रभाव नहीं होगा (यदि क्लोजर वेबपैप से लोड किया गया था) या ब्रेकेज का कारण बनता है (यानी यदि आप क्लोजर.जर को $ CATALINA_HOME/lib में डालते हैं 'लेकिन वेबपैड से कोड लोड करने का प्रयास करें)। प्रश्न: क्यों न केवल वेबपैप से एक आरईपीएल सर्वर शुरू करें, उससे कनेक्ट करें, और उस तरह से त्यागने के साथ कोड लोड करें? – cemerick

+0

धन्यवाद। हो सकता है कि मैं बस इतना रचनात्मक नहीं हूं कि मैं इसके लिए एक आरईपीएल सर्वर का उपयोग कैसे करूं :) कहें कि डिस्क पर कई फाइलों में कोड का एक गुच्छा है।मैं टोपीकैट को प्रतिलिपि सर्वर चलाने के साथ शुरू करता हूं, मैं उस कोड को कैसे प्राप्त करूं? –

0

क्या आप क्लोजर स्रोत फ़ाइलों को WEB-INF के अंतर्गत रख सकते हैं? उसके बाद आप उन्हें http://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/ServletContext.html#getResourceAsStream(java.lang.String का उपयोग कर पढ़ सकते हैं)

servletContext.getResourceAsStream("/WEB-INF/foo/core.clj");

यह पिछले बिलाव में स्रोत से संयुक्त राष्ट्र-कैश ग्रूवी वर्गों को लोड करने में मेरे लिए काम किया।

+0

ऐसा लगता है कि अगर मैं फाइलों को लोड करने के लिए 'clojure.lang.RT' प्राप्त कर सकता हूं तो यह काम करेगा। अन्यथा, '(' foo: reload) की आवश्यकता है 'संदर्भ क्लास लोडर का उपयोग करना जारी रखेगा। –

0

क्या यह cachingAllowed ध्वज से संबंधित है जैसा कि here वर्णित है? बस नीले रंग में शूटिंग।

0

या जो पंक्तियों के साथ कुछ करता clojure का एक समझौता संस्करण का उपयोग करें:

(io/input-stream (io/resource "bla.clj")) 

मैं शुद्ध है कि इस कैश नहीं है पर एक टिप्पणी पाया।

+0

'(io/resource)' संदर्भ वर्ग लोडर का उपयोग करता है, इसलिए यह टोमकैट से गुजर जाएगा और कैश किया जाएगा। :( –

+0

@ डेव-रे मुझे दावा है कि '.getResource' (' io/resource' द्वारा उपयोग किया जाता है) कैश नहीं किया जाता है। मुझे टॉमकैट नहीं पता। मेरी तरफ, यह सब अनुमान लगा रहा है।:] – kotarak