2010-02-09 15 views
9

मैं कुछ ऐसा करने की सोच रहा हूं जिसे मैंने सोचा था कि मुश्किल नहीं होने वाला था।जावा -jar: बाहरी कॉन्फ़िगरेशन फ़ाइल का उपयोग करें

मेरे पास एक ऐसा एप्लिकेशन है जिसे मैं एक जार के रूप में पैकेज करना चाहता हूं क्योंकि मुझे ~ 30 निर्भरताएं मिली हैं और मैं एक फ़ाइल को तैनात करने में सक्षम होना चाहता हूं।

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

विकास करते समय, मेरे पास इन ग्रहों को मेरी ग्रहण परियोजना के लिए क्लासपाथ की जड़ पर है और ऐप उन्हें ठीक लगता है। मुझे लगता है कि मुझे जार/क्लासपाथ सिद्धांत का कुछ महत्वपूर्ण पहलू याद आ रहा है ...

तो मैं चाहता हूं कि कॉन्फ़िगरेशन फ़ाइलें और जार को उसी निर्देशिका में डालने में सक्षम हो और ऐप को कॉन्फ़िगरेशन फाइलें मिलें जब मैं इसे मानक जावा-चीज़ चीज़ के साथ चलाता हूं।

क्या यह हासिल करने का कोई आसान तरीका नहीं है?

उत्तर

11

मैं भावी पीढ़ी के लिए इस समस्या का समाधान मेरी सुरक्षित करेगा somthing।

मुझे लगता है कि यह संभव है कि मैं जावा -जर को कुछ ऐसा करने की उम्मीद कर रहा था जो ऐसा नहीं करता है।

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

java -cp .:path/to/Jar.jar com.company.package.Class arg1=val1 arg2=val2 .... 

संभावना है कि आप तो कमांड लाइन कॉल का जोड़ा जटिलता वास्तव में बहुत को अस्वीकार करता है आप के लिए कार्यक्रम शुरू करने के लिए एक स्क्रिप्ट का निर्माण करने जा रहे हैं वैसे भी, आप के बाद से कर रहे हैं ' वैसे भी इसे एक बार बनायेगा।

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

आप यह भी देखेंगे कि मैंने दिखाया है कि आप अभी भी कमांड लाइन पर तर्कों को कैसे नियंत्रित कर सकते हैं। यह कुछ ऐसा था जो मैंने शुरू किया था जब मैंने शुरू किया लेकिन यह अपेक्षा के अनुसार काम करता है।

मुझे यकीन है कि यह केवल मूल जावा परिनियोजन ज्ञान है, लेकिन मुझे किसी कारण से इसकी कमी थी।

मुझे उम्मीद है कि यह किसी और की मदद करेगा। यह निश्चित रूप से मुझे बहुत समय बचा लेगा अगर कोई कहने में सक्षम था कि "काम करने की कोशिश करने की कोशिश न करें - बस -पीपी विधि का उपयोग करें" ...

4

आपको "।" जोड़ने की आवश्यकता है। जार फ़ाइल के क्लासपाथ में आप अपने आवेदन के लिए निर्माण कर रहे हैं।

तो प्रकट में, मैं

Main-Class: some.full.Name 
Class-Path: . needed-lib.jar other-lib.jar 

तो देखने के लिए जब आप

java -jar myapp.jar 

को क्रियान्वित करते हुए अपने अनुप्रयोग चलाने उम्मीद थी, यह वास्तव में उपयोग करता

java -classpath .;needed-lib.jar;other-lib.jar some.full.Name 

इस तरह myapp.jar फ़ाइल के साथ निर्देशिका में कोई भी फ़ाइल क्लासपाथ पर भी होगी। वह क्लासपाथ जार के स्थान से संबंधित है।

लॉग 4j के लिए log4j.xml कॉन्फ़िगरेशन फ़ाइल क्लासपाथ पर होने की अपेक्षा करता है। यदि आप log4j.xml नाम का उपयोग नहीं कर रहे हैं तो आपको log4j लाइब्रेरी को एक अलग नाम देखने के लिए अपने स्टार्टअप कमांड में सिस्टम प्रॉपर्टी भी जोड़नी होगी।

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

+0

उत्तर के लिए धन्यवाद जे आर । प्रकट-संस्करण: 1.0 मुख्य-क्लास: <अपने मुख्य वर्ग> कक्षा-पथ मेरे प्रकट जो मुझे लगता है कि तुम क्या सुझाव दे रहे है उस में यह है, करता है:। – Joel

+0

मैंने अपने उत्तर में और जोड़ा जो मुझे आशा है कि मदद करता है। –

+0

जय आर के जवाब देने के लिए धन्यवाद। आपकी मदद बहुत सराहना की है। हालांकि मुझे बहुत भाग्य नहीं है। मैं xml कॉन्फ़िगरेशन की बजाय log4j.properties फ़ाइल का उपयोग कर रहा हूं, लेकिन मुझे लगता है कि जब तक क्लासपाथ log4j पर फ़ाइल ठीक है, तो उसे ठीक लगाना चाहिए। वसंत विन्यास फाइल के साथ एक ही सौदा - मैं अपनी spring.xml को बुला रहा हूं लेकिन जब तक यह कक्षा में है, तब तक कोई समस्या नहीं होनी चाहिए। मेरा मैनिफ़ेस्ट.एमएफ ग्रहण के "रननेबल जार ..." निर्यातक द्वारा उत्पन्न किया जा रहा है लेकिन यह बिल्कुल आपके नमूना की तरह दिखता है। मुझे यकीन नहीं है कि यहां क्या हो रहा है। आपकी अंतर्दृष्टि के लिए फिर से धन्यवाद। – Joel

2

मुझे लगता है कि आप इसे क्लासपाथ निर्दिष्ट करने के लिए जार में एक मैनिफेस्ट के साथ कर सकते हैं जिसका उपयोग करना चाहिए।

संपादित: की तरह This

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