में क्लोजर कोड को फिर से लोड करना मेरे पास एक मौजूदा जावा वेबैप टॉमकैट में चल रहा है जिसमें मैं कुछ आदिम क्लोजर समर्थन जोड़ रहा हूं। समय के लिए, मैं क्लोजर स्रोत फ़ाइलों को क्लासपाथ पर संसाधनों के रूप में शामिल कर रहा हूं और इसे clojure.lang.RT
के माध्यम से आमंत्रित कर रहा हूं। यह आदिम है, लेकिन ठीक काम करता है।टॉमकैट
हालांकि, मैंने देखा है कि टॉमकैट के WebappClassLoader
कैश संसाधन getResourceAsInputStream()
के माध्यम से पुनर्प्राप्त किए गए हैं जो क्लोजर स्रोत कोड को पुनर्प्राप्त और संकलित करने के लिए उपयोग करता है। यही है, (require 'my-ns :reload)
कर फ़ाइल के कैश किए गए संस्करण को फिर से लोड करता है भले ही एक अद्यतन एक डिस्क पर उपलब्ध हो। क्लोजर फाइलों के लिए इस कैशिंग को रोकने या टालने का कोई तरीका है?
सबसे अच्छा मैं बिना फलहीन googling के बाद आया है WebappClassLoader.resourceEntries
से मैन्युअल रूप से प्रविष्टि को हटाने के लिए प्रतिबिंब का उपयोग करना है जो भयानक है।
मुझे कुछ याद आना चाहिए।
"जेटी/ग्लासफ़िश/जेबॉस" का उपयोग करें, "टॉमकैट को पुनरारंभ करें", आदि जो मैं ढूंढ रहा हूं वह नहीं हैं।
धन्यवाद चास। मुझे इसके बारे में सोचना होगा। 'Lib' में सामान डालना सुविधाजनक नहीं है। मुझे आश्चर्य है कि '* उपयोग-संदर्भ-क्लासलोडर *' को अन्य सामानों को खराब किए बिना कोई असर पड़ेगा। –
@ डेवरे '* उपयोग-संदर्भ-श्रेणी लोडर *' डिफ़ॉल्ट रूप से सत्य है। इसे गलत पर सेट करने से क्लासलोडर के माध्यम से मार्गों में लोड हो सकता है जो क्लोजर स्वयं लोड करता है - जिसका कोई प्रभाव नहीं होगा (यदि क्लोजर वेबपैप से लोड किया गया था) या ब्रेकेज का कारण बनता है (यानी यदि आप क्लोजर.जर को $ CATALINA_HOME/lib में डालते हैं 'लेकिन वेबपैड से कोड लोड करने का प्रयास करें)। प्रश्न: क्यों न केवल वेबपैप से एक आरईपीएल सर्वर शुरू करें, उससे कनेक्ट करें, और उस तरह से त्यागने के साथ कोड लोड करें? – cemerick
धन्यवाद। हो सकता है कि मैं बस इतना रचनात्मक नहीं हूं कि मैं इसके लिए एक आरईपीएल सर्वर का उपयोग कैसे करूं :) कहें कि डिस्क पर कई फाइलों में कोड का एक गुच्छा है।मैं टोपीकैट को प्रतिलिपि सर्वर चलाने के साथ शुरू करता हूं, मैं उस कोड को कैसे प्राप्त करूं? –