2010-10-23 23 views
68

मैं एक जावा एप्लिकेशन (सर्वर एप्लिकेशन) को कार्यान्वित करना चाहता हूं जो किसी दिए गए यूआरएल से एक नया संस्करण (.jar फ़ाइल) डाउनलोड कर सकता है, और उसके बाद रनटाइम पर अपडेट हो सकता है।मैं जावा एप्लिकेशन कैसे लिख सकता हूं जो रनटाइम पर खुद को अपडेट कर सकता है?

ऐसा करने का सबसे अच्छा तरीका क्या है और क्या यह संभव है?

मुझे लगता है कि एप्लिकेशन एक नई .jar फ़ाइल डाउनलोड कर सकता है और इसे शुरू कर सकता है। लेकिन मुझे हैंडओवर कैसे करना चाहिए, उदा। जानें कि नया एप्लिकेशन कब शुरू होता है और फिर बाहर निकलें। या ऐसा करने का एक बेहतर तरीका है?

+4

क्या आपने जावा वेब स्टार्ट देखा है? यह रनटाइम पर खुद को अद्यतन नहीं करता है, मुझे विश्वास है, (आवश्यक पुनरारंभ), इसके लिए आपको शायद ओएसजीआई को देखने की आवश्यकता है। – Thilo

+0

@ थिलो: मुझे लगता है कि किसी दिए गए यूआरएल से फ़ाइल डाउनलोड करना आसान होगा, और उसके बाद चल रहे जार फ़ाइल से लिनक्स कमांड के साथ इसे शुरू करें। – Jonas

+1

जावा वेबस्टार्ट एपीआई का डिज़ाइन चलते समय अपडेट करना असंभव बनाता है। दुर्भाग्य से। –

उत्तर

46

एक समाधान की बुनियादी संरचना इस प्रकार है:

  • एक मुख्य पाश बार-बार एप्लिकेशन का नवीनतम संस्करण लोड हो रहा है (यदि आवश्यक हो) और इसे शुरू करने के लिए जिम्मेदार नहीं है।

  • एप्लिकेशन इसकी बात करता है, लेकिन समय-समय पर डाउनलोड यूआरएल की जांच करता है। यदि यह एक नया संस्करण पता लगाता है तो यह लॉन्चर पर वापस निकलता है।

इस पर लागू करने के कई तरीके हैं। उदाहरण के लिए:

  • लांचर एक आवरण स्क्रिप्ट या द्विआधारी अनुप्रयोग है कि प्रतिस्थापित हो जाता है कि एक जार फ़ाइल से आवेदन को चलाने के लिए एक नया JVM शुरू होता है हो सकता है।

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

बाहरी आवरण दृष्टिकोण के लाभ हैं:

  • आप केवल एक जार की जरूरत है ,
  • आप संपूर्ण जावा अनुप्रयोग की जगह ले सकता
  • किसी भी माध्यमिक धागे ऐप्लिकेशन द्वारा बनाया गया, आदि विशेष शटडाउन तर्क के बिना दूर जाना होगा, और
  • आप भी इधर-उधर वसूली के साथ सौदा कर सकते हैं मीटर अनुप्रयोग क्रैश, आदि

दूसरा दृष्टिकोण दो जार आवश्यकता है, लेकिन निम्न लाभ हैं:

  • समाधान शुद्ध जावा और पोर्टेबल है,
  • बदलाव तेज हो जाएगा, और
  • आप पुनरारंभ (मॉड्यूल रिसाव मुद्दों) में राज्य को अधिक आसानी से बनाए रख सकते हैं।

"सर्वोत्तम" तरीका आपकी विशिष्ट आवश्यकताओं पर निर्भर करता है।

यह भी ध्यान दिया जाना चाहिए कि:

  • स्वत: अपडेट के साथ सुरक्षा जोखिम भी हैं। आम तौर पर, यदि अद्यतन प्रदान करने वाला सर्वर समझौता किया गया है, या यदि अद्यतन प्रदान करने के लिए तंत्र हमले के लिए अतिसंवेदनशील हैं, तो ऑटो-अपडेटिंग क्लाइंट (ओं) के साथ समझौता कर सकती है।

  • क्लाइंट को नुकसान पहुंचाने वाले क्लाइंट को अद्यतन को धक्का देना कानूनी जोखिम हो सकता है, और आपके व्यवसाय की प्रतिष्ठा के लिए जोखिम हो सकता है।


आप एक तरह से पहिया पुनर्रचना से बचने के लिए मिलता है, तो यह है कि अच्छा होगा। सुझावों के लिए अन्य उत्तरों देखें।

2

यह आवश्यक नहीं है सर्वोत्तम रास्ता, लेकिन यह आपके लिए काम कर सकता है।

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

  • अगर कोई अपडेट उपलब्ध है, यह यह उपयोगकर्ता के लिए आवेदन तारीख तक है की पेशकश करेगा, डाउनलोड, स्थापना संभाल, आदि
  • , यह उपयोगकर्ता आवेदन
  • शुरू करने के लिए अनुमति देगा
  • वैकल्पिक रूप से, आप, उपयोगकर्ता ऐप्स लॉन्च करने की अनुमति दे सकते हैं, भले ही वह तारीख

इस तरह आप अपने आवेदन की एक निकास के लिए मजबूर कर के बारे में चिंता करने की जरूरत नहीं करने के लिए नहीं है।

यदि आपका आवेदन वेब आधारित है, और यदि यह महत्वपूर्ण है कि उनके पास एक अद्यतित ग्राहक है, तो आप एप्लिकेशन चलाने के दौरान संस्करण जांच भी कर सकते हैं। सर्वर (कुछ या सभी कॉल), या दोनों के साथ सामान्य संचार करते समय आप उन्हें अंतराल पर कर सकते हैं।

किसी उत्पाद के लिए मैंने हाल ही में काम किया है, हमने लॉन्च (बिना बूट स्टैपर ऐप के, लेकिन मुख्य विंडो दिखाई देने से पहले) पर संस्करण जांच की है, और सर्वर पर कॉल के दौरान। जब ग्राहक पुराना था, तो हमने मैन्युअल रूप से छोड़ने के लिए उपयोगकर्ता पर भरोसा किया, लेकिन सर्वर के खिलाफ किसी भी कार्रवाई को रोक दिया।

कृपया ध्यान दें कि मुझे पता नहीं है कि जावा आपकी मुख्य विंडो लाने से पहले यूआई कोड का आह्वान कर सकता है या नहीं। हम सी #/डब्ल्यूपीएफ का उपयोग कर रहे थे।

+0

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

+0

जब आप "सर्वर एप्लिकेशन" कहते हैं, तो क्या आपका मतलब यह है कि यह एक ऐसा एप्लिकेशन है जो सीधे सर्वर पर चलाया जाता है, जबकि लॉग इन किया जाता है? –

+0

@ जोनास: मुझे इस बारे में बहुत कुछ नहीं पता कि कैसे .jar फाइलें काम करती हैं, इसलिए मैं वहां बहुत अधिक सेवा नहीं कर सकता। मैं समझ सकता हूं कि क्या आप जावा के लिए विशिष्ट उत्तर पसंद करेंगे। उम्मीद है कि यह आपको कम से कम विचार के लिए भोजन देता है, कम से कम :) –

10

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

समाधान जार से फ़ाइलों को लोड करने के लिए कस्टम क्लासलोडर का उपयोग करता है। एक बार लोड होने के बाद आप नए जार से कुछ विधि का आह्वान कर सकते हैं जो इसकी main विधि के रूप में कार्य करेगा। फिर मुश्किल हिस्सा यह सुनिश्चित कर रहा है कि आप पुराने कोड के सभी संदर्भों से छुटकारा पाएं ताकि कचरा इकट्ठा किया जा सके। मैं उस हिस्से पर काफी विशेषज्ञ नहीं हूं, मैंने इसे काम किया है लेकिन यह आसान नहीं था।

+0

मुझे जावा के बारे में पता नहीं है, लेकिन सी # में, आप स्पष्ट रूप से कोड को अनलोड करने के लिए ऐपडोमेन्स का उपयोग कर सकते हैं। शायद जावा में एक समान अवधारणा है। –

+0

+1। अच्छा सुझाव –

+1

धन्यवाद, ऐसा लगता है कि यह जाने का तरीका है। [क्लासलोडर] के लिए जावाडॉक पर 'नेटवर्क क्लासलोडर' का एक उदाहरण है (http://download.oracle.com/javase/6/docs/api/java/lang/ClassLoader.html) – Jonas

5
  1. पहला तरीका: टोमकैट और इसकी तैनाती सुविधाओं का उपयोग करें।
  2. दूसरा तरीका: दो भागों (कार्यात्मक और अद्यतन) पर एप्लिकेशन को विभाजित करने के लिए और भाग भाग को प्रतिस्थापित करने दें।
  3. तीसरा तरीका: आपके सर्वर की प्रशंसा में बस नया संस्करण डाउनलोड करें, फिर पुराना संस्करण बाध्य बंदरगाह जारी करता है, फिर पुराना संस्करण नया संस्करण चलाता है (प्रक्रिया शुरू करता है), तो पुराना संस्करण पुराने संस्करण को हटाने के लिए नए संस्करण में एप्लिकेशन पोर्ट पर एक अनुरोध भेजता है , पुराना संस्करण समाप्त हो गया है और नया संस्करण पुराने संस्करण को हटा देता है। इस तरह: alt text
+0

आपका दूसरा तरीका एक दिलचस्प डिजाइन प्रतीत होता है। – Jonas

2

आप Equinox प्लग इन का उपयोग अपने आवेदन का निर्माण, तो आप P2 Provisioning System का उपयोग इस समस्या का रेडीमेड समाधान प्राप्त करने के लिए कर सकते हैं। अपडेट के बाद सर्वर को खुद को पुनरारंभ करने की आवश्यकता होगी।

7

यह एक ज्ञात समस्या है और मैं एक पहिया को पुनर्निर्मित करने के खिलाफ अनुशंसा करता हूं - अपना खुद का हैक न लिखें, बस अन्य लोगों ने पहले ही क्या किया है इसका उपयोग करें।

दो स्थितियों पर विचार करने की जरूरत है:

  1. अनुप्रयोग स्वयं updatable हो सकता है और अद्यतन (सर्वर अनुप्रयोग, एम्बेडेड क्षुधा) के दौरान भी चालू रखने के लिए की जरूरत है। ओएसजीआई के साथ जाएं: Bundles या Equinox p2

  2. ऐप एक डेस्कटॉप ऐप है और इसमें इंस्टॉलर है। अद्यतन विकल्प के साथ कई इंस्टॉलर हैं। installers list देखें।

28

मैं वर्तमान में एक जावा लिनक्स डेमॉन विकसित कर रहा हूं और ऑटो-अपडेट तंत्र को लागू करने की आवश्यकता भी थी। मैं अपने आवेदन को एक जार फ़ाइल में सीमित करना चाहता था, और एक साधारण समाधान के साथ आया:

अद्यतन में अद्यतनकर्ता एप्लिकेशन को पैक करें।

आवेदन: आवेदन एक नए संस्करण का पता लगाता है यह करता है निम्नलिखित:

  1. डाउनलोड अद्यतन (zipfile)
  2. निकालें आवेदन और ApplicationUpdater (zipfile में सभी)
  3. रन अपडेटर

ApplicationUpdater: अपडेटर चलाता है जब यह निम्नलिखित है:

  1. आवेदन
  2. कॉपी (मेरे मामले init.d के माध्यम से एक डेमॉन में) बंद करो वर्तमान आवेदन
  3. प्रारंभ अधिलेखित करने के लिए डाउनलोड किया जार फ़ाइल आवेदन
  4. सफाई।

आशा है कि यह किसी की सहायता करे।

0

मुझे एक नया जार (आदि) डाउनलोड करते समय सुरक्षा समस्या दिखाई देती है, उदाहरण के लिए, मध्य हमले में एक आदमी। आपको हमेशा अपने डाउनलोड करने योग्य अपडेट पर हस्ताक्षर करना होगा।

JAX2015 पर, एडम बिएन ने द्विआधारी अद्यतन करने के लिए जेजीआईटी का उपयोग करने के बारे में बताया। दुख की बात है कि मुझे कोई ट्यूटोरियल नहीं मिला।

Source in German.

एडम बिएन अपडेटर see here

बनाया मैं इसे कुछ JavaFX दृश्यपटल साथ here काँटेदार। मैं स्वचालित हस्ताक्षर पर भी काम कर रहा हूं।

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