2010-03-17 20 views
8

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

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

समस्या को हल करने के लिए मैं निम्नलिखित तीन दृष्टिकोण देख सकता हूं, उन पर टिप्पणी करने या दूसरों का सुझाव देने के लिए स्वतंत्र महसूस करें।

  1. बताएँ जावा लिखने के लिए JAR फ़ाइल अनलॉक करने के लिए (यह does not संभव प्रतीत लेकिन यह Easyest समाधान होगा)
  2. कॉपी आवेदन स्टार्टअप पर tempory फाइल करने के लिए निष्पादन योग्य वर्ग फ़ाइलों, लोड करने के लिए एक वर्ग लोडर का उपयोग इन फ़ाइलों को और प्रारंभिक जेएआर फ़ाइल से अनलोड करें। (क्लासलोडर्स के साथ बहुत अधिक अनुभव नहीं था, लेकिन उम्मीद है कि जेवीएम इतना समझने के लिए पर्याप्त होगा कि मूल जेएआर उपयोग में नोलॉन्डर है और इसलिए इसे अनलॉक करें)
  3. एक सेकेंड रखो पहले के अंदर निष्पादन योग्य जेएआर फ़ाइल, स्टार्टअप पर आंतरिक जार को ई अस्थायी रूप से निकालने के लिए, प्रतिलिपि आंतरिक जेएआर का उपयोग करके एक नई जावा प्रक्रिया का आह्वान करें और इसे बाहरी जार का स्थान पास करें, पहली प्रक्रिया बाहर निकलता है, दूसरी प्रक्रिया बाहरी जार unincumbered modifys। (यह काम करते हैं लेकिन यकीन नहीं वहाँ एक जावा अनुप्रयोग एक और लागू की एक मंच स्वतंत्र तरीका है im होगा)

मैं जानता हूँ कि यह एक अजीब सवाल है, लेकिन किसी भी मदद की सराहना की जाएगी ।

+3

क्या आप कोई संकेत दे सकते हैं कि निष्पादन के दौरान आपको जार फ़ाइल को संशोधित करने की आवश्यकता क्यों है? – Poindexter

+0

@ पंकिनोब्रेन आप पुराने स्कूल चींटी तरीके से सोच रहे हैं, मेरा सुझाव है कि आप उदाहरण के लिए मुफ्त ईबुक द्वारा मेवेन पढ़ते हैं, आप देखेंगे कि आप जो सुझाव दे रहे हैं उसे कोई मतलब नहीं है .. मैं आपको आपकी मदद करने की कोशिश नहीं कर रहा हूं .. क्या हम सभी वहां नहीं हैं – ant

+0

आप क्या हासिल करने की कोशिश कर रहे हैं - एक स्व-अद्यतन आवेदन? –

उत्तर

2

एक विकल्प:

कार्यक्रम JAR फ़ाइल का एक संशोधित प्रतिलिपि लिख लो।

जेएआर फ़ाइल में एक उपयोगिता के साथ एक दूसरा जार फ़ाइल शामिल करें, जब निष्पादित किया जाता है, मूल JAR फ़ाइल हटा देता है और संशोधित प्रति को मूल के मिलान के लिए नामित करता है।

जब आपका प्रोग्राम निकलता है (और परिवर्तन किए गए हैं) इस उपयोगिता को निकालें और इसे अपने स्वयं के जेवीएम में लॉन्च करें (Runtime.getRuntime().exec() का उपयोग करके)। उपयोगिता लॉक को मूल, अनमोडिफाइड जेएआर से बाहर निकलने का इंतजार करेगी और उसके बाद अपना व्यवसाय करेगी और बाहर निकल जाएगी।

उपयोगकर्ता को JAR फ़ाइल बाहर निकलने पर अपडेट होने लगती है (या पर्याप्त बंद करें!)।

+0

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

+0

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

+0

क्या वास्तविक कॉल से पहले प्लेटफॉर्म 'स्वतंत्र' तरीके से 'Runtime.getRuntime()। exec() 'निष्पादित करने के लिए आपको आवश्यक सारी जानकारी प्राप्त हो रही है। मुझे लगता है कि' System.getProperties() 'विधि में कुछ उपयोगी जानकारी है समझना। –

1

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

कुछ भी "हवा के खिलाफ लड़ना" है - आप कुछ संघर्ष करने के साथ इसे काम करने के लिए मिल सकते हैं, लेकिन यह आपको अंततः ग्राहक या काट देगा।

+0

मुझे खेद है कि आपको यह जवाब पसंद नहीं है। नामकरण, लॉकिंग इत्यादि के साथ, मैं सिर्फ अपनी राय व्यक्त कर रहा था कि आप ऐसे समाधान को मजबूर करने की कोशिश कर रहे थे जो समस्या को ठीक से फिट न करे। – MJB

+1

तो यह एक टिप्पणी होगी, जवाब नहीं –

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