java - हॉट क्लास रीलोडिंग के लिए विभिन्न जावा प्लगइन के बीच अंतर क्या हैं और कौन सा सबसे सहज है?




dynamic plugins (2)

ब्लॉक पर एक नया बच्चा है, RelProxy , यह ओपन सोर्स है, जेआरबेल की तरह इतना उन्नत नहीं है, लेकिन इसका इस्तेमाल रनटाइम में आपके कोड के सबसेट को स्वतंत्र रूप से बदलने के लिए किया जा सकता है और लगभग कोई प्रदर्शन जुर्माना नहीं लगाया जा सकता है और संदर्भ पुनः लोड करने की आवश्यकता नहीं है यदि आप चाहें तो विकास और उत्पादन में कोई सत्र खो गया नहीं है।

मैं वर्तमान में जावा एप्लिकेशन में हॉट क्लास रीलोडिंग को लागू करने की कोशिश कर रहा हूं, हालांकि इसमें से चुनने के लिए बहुत से प्लगइन हैं और मुझे विकल्पों के बीच अच्छी तुलना नहीं मिल रही है। प्लगइन की वेबसाइटें बिल्कुल सटीक नहीं हैं कि सटीक सुविधाएं क्या हैं और उनका उपयोग कैसे करें।

एक कस्टम हॉट क्लास रीलोडिंग क्लासलोडर बनाने का विकल्प भी है, लेकिन मुझे लगता है कि यह "पहिया को फिर से शुरू करने " जैसा ही है, यदि पहले से ही बहुत से प्लगइन हैं जो नौकरी कर सकते हैं .. क्या अन्य लोग इसके साथ सहमत हैं?

मुझे पता चला कि जावा प्लगइन्स जो मुझे लगता है कि नौकरी कर सकते हैं:

तो क्या किसी को यह पता चल जाता है कि प्लगइन के बीच मतभेद क्या हैं? और कौन सा प्लगइन उपयोग करने के लिए सबसे सहज है?

एक साइड नोट के रूप में: मैं वास्तव में जो करना चाहता हूं वह मेरे जावा एप्लिकेशन की .jar- फ़ाइल निर्भरता को पुनः लोड करना है। मेरे पास कुछ जावा कोड है जो स्वचालित रूप से फिर से संकलित हो जाता है और फिर एक .jar-file में परिवर्तित हो जाता है। यह मेरे जावा एप्लिकेशन की निर्भरता है, और मेरे आवेदन को हर बार .jar-file के नवीनतम संस्करण का उपयोग करने की आवश्यकता है।


अस्वीकरण: मैं जेरेबेल विकास से जुड़ा हूं और इसलिए मेरा जवाब थोड़ा पक्षपातपूर्ण दिख सकता है, लेकिन मैं समझाने के लिए अपनी पूरी कोशिश करूंगा।

इस प्रश्न का उत्तर देने के लिए मैं सबसे पहले इस तथ्य पर आपका ध्यान आकर्षित करना चाहता हूं कि आपके द्वारा सूचीबद्ध नामों में से एक मुख्य अंतर यह है: कुछ समाधानों के लिए आपको एप्लिकेशन डिज़ाइन बदलने की आवश्यकता होती है, अन्य नहीं।

यदि आप सही पथ का पालन करते हैं और अपने आवेदन को मॉड्यूलर करते हैं तो ओएसजीआई या जेबॉस मॉड्यूल जैसे मॉड्यूलरलाइजेशन समाधान लाभ प्रदान करते हैं। अन्यथा, यदि आप एक सिलो बंडल को तैनात करते हैं, तो इसका मूल रूप से मतलब है कि आप पूरे एप्लिकेशन को पुनरारंभ / पुन: नियोजित कर रहे हैं, इस प्रकार इस दृष्टिकोण से प्राप्त किसी भी लाभ को कम कर रहे हैं।

प्ले फ्रेमवर्क वास्तव में एक पूर्ण-ढेर ढांचा है जिसमें गर्म-तैनाती क्षमताएं हैं। आपके द्वारा उपयोग किए जाने वाले ढांचे के किस संस्करण के आधार पर वे क्षमताओं में भिन्नता है। लेकिन फिर, मॉड्यूलरिटी के साथ एक ही कहानी - ढांचा एक निश्चित प्रोग्रामिंग मॉडल लागू करता है।

अपाचे कॉमन्स जेसीआई कोड को गर्म करने के लिए वास्तव में एक समाधान नहीं है। AFAIK, यह सिर्फ नए क्लासलोडर के माध्यम से कक्षा को संकलित और लोड करता है। इसमें उपर्युक्त मामलों में आवेदन कोड को बदलने में भी शामिल है। मुझे सच में यकीन नहीं है कि यह अच्छा है या बुरा है। नकारात्मकता यह है कि आप इस तरह से पारिस्थितिकी तंत्र के साथ शायद ही कोई व्यापक एकीकरण कर सकते हैं। यह दृष्टिकोण एक स्व-निर्मित ढांचे के लिए संभव है जो इस सुविधा का उपयोग करेगा। खुद, मैं इसे प्राप्त करने के लिए ग्रोवी, जेआरबी या जावास्क्रिप्ट जैसी एक स्क्रिप्टिंग भाषा का उपयोग करना चाहूंगा। उदाहरण के लिए, ऐसा कुछ।

जेरेबेल , फेकेरेप्लेस और डीसीईवीएम - उन लोगों को प्रोग्रामिंग मॉडल की परवाह नहीं है। लेकिन अंतर काफी बड़ा है:

डीसीईवीएम जेवीएम को पैच करता है और इसका लक्ष्य एक पूर्ण हॉटस्पैप समाधान प्रदान करना है, जो यह करता है।

जेरेबेल एक जावा एजेंट है (-जवाजेंट वीएम तर्क के साथ झुका हुआ), जो अनुप्रयोग कोड को नियंत्रित करता है और उन्हें संस्करणित करके कक्षाओं के नए संस्करण लोड करता है। जेरेबेल का मुख्य मूल्य यह है कि यह बड़ी मात्रा में ढांचे के विशिष्ट एकीकृतताओं के साथ लचीला कॉन्फ़िगरेशन प्रदान करता है, ताकि आप जावा कक्षाओं के एक हॉटस्पैप से कहीं अधिक कर सकें। उदाहरण के लिए, स्प्रिंग एप्लिकेशन संदर्भ में नए सेम जोड़ें और ऑटोवायर करें, फ्लाई पर नए ईजेबी जोड़ें, और नए स्ट्रूट एक्शन इत्यादि।

Fakereplace JRebel की तरह एक उपकरण एजेंट भी है, लेकिन जावा कोड में परिवर्तन के लिए इसका बहुत कम समर्थन है (मुझे लगता है) और समर्थित ढांचे की संख्या प्रभावशाली नहीं है।

फीनिक्स जावा इंस्ट्रूमेंटेशन एपीआई जितना कर सकता है उतना ही कर सकता है। जिसका मूल रूप से मतलब है कि यह वास्तव में JVM के मानक हॉटस्पेप के शीर्ष पर मूल्य नहीं जोड़ता है। एजेंटस्मिथ के लिए वही

अद्यतन: इस जवाब ने फीनिक्स के लेखक को एक नए संस्करण के साथ आने के लिए प्रेरित किया - फीनिक्स 2.0 जो जेआरबेल कक्षाओं के साथ काम करता है जैसा दिखता है। लेकिन जैसा कि लेखक खुद कहता है - फेनिक्स अभी भी जेरेबेल से काफी कम है। कुछ समान समाधान भी हैं, जैसे हॉटस्पेपएजेंट और स्प्रिंग लोडेड - वे टूल समान कार्यक्षमता भी प्रदान करते हैं लेकिन अपने तरीके से सीमित होते हैं।

अब आपकी विशिष्ट समस्या पर थोड़ा सा , यह जेरेबेल के साथ कैसे हल किया जा सकता है:

एप्लिकेशन के प्रत्येक मॉड्यूल में अपनी कॉन्फ़िगरेशन फ़ाइल, rebel.xml होनी चाहिए। मॉड्यूल द्वारा, हमारा मतलब है, या तो ईएआर, युद्ध, या वेब-आईएनएफ / lib (जैसे आपके मामले में) या सर्वर विशिष्ट पुस्तकालयों में जेएआर निर्भरताओं में से कोई भी। कॉन्फ़िगरेशन फ़ाइल उस निर्देशिका के बिंदु के साथ जहां संकलित कक्षाएं हैं और जेरेबेल सीधे उस स्थान से कक्षाएं लोड करेगा। इसका मतलब यह है कि जावा क्लास में बदलाव करने के बाद आपको पूरे जेएआर को इकट्ठा करने की आवश्यकता नहीं है। इसके बजाए , आप एक बदलाव करते हैं और स्रोत संकलित करते हैं (बिल्ड स्क्रिप्ट के बजाय आईडीई का लाभ उठाते हैं)। एक बार क्लास को आवेदन कोड के भीतर बुलाए जाने के बाद संकलित कक्षा को जेआरबेल द्वारा पुनः लोड किया जाएगा।





hotswap