2009-06-26 17 views
5

मैं कुछ हफ्तों के लिए जावा प्रोग्रामिंग के लिआंग के परिचय को पढ़ रहा हूं, और यह सवाल तब आया जब लेखक ने कहा, "डेवलपर्स को बनाने की आवश्यकता नहीं है, और उपयोगकर्ताओं के लिए स्थापित करने के लिए, नए नए सॉफ्टवेयर संस्करण हैं।"सॉफ़्टवेयर अद्यतन कैसे काम करता है?

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

मैं इस विषय पर पुस्तकों में भी रूचि रखता हूं।

धन्यवाद।

उत्तर

3

पुस्तक

Practical API Design - Confessions of a Java Framework Architect (जारोस्लाव Tulach, अप्रेस, 2008)

मुझे लगता है कि पहलुओं के बारे में पूछ रहे हैं के सबसे को शामिल किया गया पर एक नज़र डालें।

शिपिंग के नए सॉफ्टवेयर संस्करणों या अद्यतनों के विषय पर, उदाहरण के लिए प्रौद्योगिकी Java Web Start पर एक नज़र डालें।

किसी वेब एप्लिकेशन को अपडेट भेजना उपयोगकर्ताओं के चेहरे पर अंतर्निहित माना जा सकता है क्योंकि केंद्रीकृत सर्वर पर किए गए परिवर्तन वेब ब्राउज़र द्वारा ही वितरित किए जाते हैं।

या सर्वर

-1

का एक सेट है कि एकल जिम्मेदारी सिद्धांत की बात नहीं है। http://en.wikipedia.org/wiki/Single_responsibility_principle

प्रैक्टिस में यह काम नहीं प्रतीत होता है, जब तक कि आपके पास विंडोज़ की तरह वास्तव में बहुत कुछ नहीं है, जिसे आप टुकड़े या ऐसे गेम को अपडेट कर सकते हैं जो बहुत सारे बनावट का उपयोग करते हैं जिन्हें बदलने की आवश्यकता नहीं है।

0

ऐसे गेम पर विचार करें जिसे कई स्वतंत्र मॉड्यूल के लिए आर्किटेक्टेड किया गया है, प्रत्येक एक दूसरे के साथ इंटरफेस के माध्यम से बातचीत कर रहा है। इस तरह के एक गेम की शुरुआती तैनाती में 15 या 20 व्यक्तिगत जार फाइलें हो सकती हैं।

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

यदि आप 15 परियोजनाओं में एक परियोजना पर काम कर रहे थे, तो आप एक गरीब व्यक्ति का संस्करण होगा, और आप जारों में से एक को एक महत्वपूर्ण बग फिक्स कर देते हैं। आपको अपने ग्राहक के सिस्टम में सभी 15 जारों की प्रतिलिपि नहीं लेनी पड़ेगी - आप जो बदलते हैं उसे कॉपी करें।

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

यह उल्लेख करना महत्वपूर्ण है कि यह लाभ, निश्चित रूप से मान्य और वास्तविक, स्थिरता और मॉड्यूल के बीच निर्भरता को कम करने और अच्छी तरह परिभाषित इंटरफेस का उपयोग करने से आने वाली कोडिंग की आसानी के मुकाबले काफी मामूली है।

0

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

डेस्कटॉप/मोटी क्लाइंट के लिए सॉफ़्टवेयर अपडेट के लिए कुछ वाणिज्यिक और निःशुल्क समाधान उपलब्ध हैं। तुलना के लिए यह article देखें। यह पुराना है, नए समाधान उपलब्ध होने के लिए बाध्य हैं।

2

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

public interface foo { 
    public void bar(); 
} 

public class A implements foo { 
    public void bar() { 
     // some code 
    } 
} 

public class Example { 
    public static void main(String[] args) { 
     foo aFoo = new A(); 
     aFoo.bar(); 
    } 
} 

कक्षा उदाहरण में, एक चर नामक एक चर को प्रकार foo, इंटरफ़ेस घोषित किया जाता है। ए, जो foo इंटरफ़ेस लागू करता है, में विधि बार() के काम करने के लिए कोड होगा। कक्षा उदाहरण में, परिवर्तनीय एएफयू को कक्षा ए का एक उदाहरण मिलता है, इसलिए ए के बार() विधि में जो भी कोड होता है उसे निष्पादित किया जाएगा जब aFoo.bar() को कॉल किया जाता है भले ही AF को foo प्रकार का घोषित किया जाता है।

तो, हमने स्थापित किया है कि सभी कार्य कक्षा ए में किए जाते हैं। उपरोक्त दो वर्ग और एक इंटरफेस प्रत्येक को अपनी फ़ाइल में परिभाषित किया जा सकता है। सभी तीन परिणामस्वरूप। क्लास फ़ाइलों को एक जार में पैक किया जा सकता है और कार्यक्रम के संस्करण 1.0 के रूप में ग्राहकों को भेज दिया जा सकता है। कुछ समय बाद, कक्षा ए में बार() के कार्यान्वयन में एक बग की खोज की जा सकती है। एक बार एक फिक्स विकसित हो जाने पर, यह मानते हुए कि सभी बार() विधि के अंदर परिवर्तन होते हैं, केवल ए के लिए .class फ़ाइल को भेजना आवश्यक है ग्राहकों। अपडेटेड एक्लास को प्रोग्राम की .jar फ़ाइल में डाला जा सकता है (.jar फाइलें बस .zip फाइलें हैं) एक्लास के पिछले, टूटे हुए संस्करण को ओवरराइट कर रही हैं। जब प्रोग्राम को पुनरारंभ किया जाता है तो JVM एबर() के नए कार्यान्वयन को लोड करेगा और कक्षा उदाहरण को नया व्यवहार मिलेगा।

लगभग हर चीज के साथ, अधिक जटिल प्रोग्राम, अच्छी तरह से, अधिक जटिल हो सकते हैं। लेकिन सिद्धांत एक ही हैं।

0

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

0

मैं वास्तव में विश्वविद्यालय में इसका थोड़ा सा अध्ययन करता हूं, और विशेष रूप से इसके लिए अनुसंधान पर मुझे वास्तव में यह काफी दिलचस्प लगता है। अपडेट निर्दिष्ट करने के लिए एक चीज विशेष रूप से रिकॉर्डिंग दर्ज की जाती है जहां आपके द्वारा रिलीज़ किए गए प्रत्येक संस्करण के लिए आपने जो अपडेट किया है उसे निर्दिष्ट करते हैं। उदाहरण के लिए कहें संस्करण 1.0.1 और 1.0.2 के बीच का अंतर यह है कि mylib.dll को अद्यतन किया गया है। अब कहें कि 1.0.2 और 1.0.4 के बीच का अंतर यह है कि myotherlib.dll बदल गया है, यदि कोई व्यक्ति अपने सॉफ़्टवेयर को नवीनतम संस्करण (1.0.4) में अपडेट करता है और वर्तमान में उनके पास 1.0.1 है तो दोनों डीएल अपडेट में शामिल हैं ।

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

0

उसके बारे में यहां सरल बैच फ़ाइल ऑटो Updater आप अवधारणा के साथ आरंभ करने के लिए ... आप पृष्ठभूमि में इसे चलाने और उसका उपयोग जावा में इसे लिखने की फ़ाइलों को अद्यतन करने के लिए बजाय कर सकते हैं, मैं यह आसान सी में लिखने के लिए लगता है ++ हालांकि।

@echo off 
if not exists "file.jar" goto FM 
cls 
echo [1] Update 
echo [2] Exit 
set /p "main=1OR2:" 

if %main% == 1 goto U 
if %main% == 2 exit 

:U 
cls 
echo Updating... 
del "file.jar" 
wget "http://yourserver.com/file.(EXTENSION)" 
if not exists "file.jar" goto FM 
cls 




:FM 
cls 
echo You are missing important files! 
pause >nul 
exit 

मैं सलाह है कि आप कैसे जावा में यह करने के लिए जानने के लिए, लेकिन आप नामित सर्वर "version.bat" में एक फ़ाइल रख सकते हैं आप और अधिक उन्नत प्राप्त करना चाहते हैं और फिर उन लैपटॉप के लिए वह भी डाउनलोड ताकि वह इसे पढ़ सके और यदि उसके पास वही संस्करण है जो उनके पास है, तो यह डाउनलोड को छोड़ देगा और कहेंगे कि आपके पास सबसे उन्नत संस्करण है!

नोट: (anything.bat) इस कोड को आप गूगल पर जाने के लिए और खोज wget, उचित फ़ाइल डाउनलोड करने और ऊपर दिए गए कोड को उसी फ़ोल्डर में डाल की जरूरत करने के लिए, के रूप में भी उपरोक्त कोड को बचाने

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