2011-02-01 19 views
5

पर पास करना मेरे पास कई सिस्टम हैं जिन्हें सभी को समान गुणों को JVM में लोड करने की आवश्यकता है। मैं एक समय में एक संपत्ति को लोड करने के लिए -D ध्वज का उपयोग कर सकता हूं, लेकिन मुझे ऐसा कुछ ढूंढ रहा है जो एक ही समय में पूरी फाइल में सभी गुणों को लोड करेगा। उदाहरण के लिए:एक पूरी फ़ाइल को JVM तर्क

मैं बस अपने नेटवर्क पर सभी jvms में --options-file = blah.properties जोड़ सकता हूं, और तब से केवल गुण फ़ाइल को बदल सकता हूं, जो नेटवर्क शेयर पर एक केंद्रीय फ़ाइल हो सकता है ।

धन्यवाद,

संपादित करें: किसी भी तर्क या आदेशों को भी एक विंडोज़ वातावरण में काम करना चाहिए। इसलिए यूनिक्स के लिए विशिष्ट कोई भी बैश या स्क्रिप्टिंग हैक्स काम नहीं करेगा।

उत्तर

6

है कि मोटे तौर पर हम इसे कैसे करते हैं:

java $(tr '\n' ' ' < options_file) other args...

यहाँ options_file तैयार -Dsomething या -Xsomething मान हैं, प्रति पंक्ति एक। tr कमांड बस एक स्थान के साथ हर नई लाइन को बदल देता है।

+1

मुझे नहीं लगता कि यह विंडोज़ में काम करेगा। – doug

+1

@doug: यह नहीं होगा। विंडोज़ के तहत, आपको 'for/s delim = ...' जैसी कुछ चाहिए, याद नहीं है, लेकिन विंडोज़ लाइन लाइन को फाइल लाइन को पढ़ने का तरीका प्रदान करती है; आप इन लाइनों को एक पर्यावरण चर में जोड़ते हैं। – 9000

+0

ठीक है, मैं इसे आज़मा दूंगा। धन्यवाद, – doug

3

कुछ विकल्प:

  1. अपने .jar फ़ाइल में अपने गुण लपेटें और फिर उस गुण से getClass().getResourceAsStream()
  2. फाइल अपने जावा प्रक्रियाओं पर अमल करने के लिए एक बैच फ़ाइल लिखें पढ़ने के लिए अपनी प्रक्रियाओं मिलता है, और या तो स्पष्ट सूची -D विकल्प, या गतिशील रूप से कमांड लाइन बनाएँ।

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

+1

getClass()। GetResourceAsStream() से ओएस निर्धारित करने के लिए है कुछ आप अनुप्रयोग के अंदर कर के बाद इसे शुरू किया है, सही है? किसी भी एप्लिकेशन को शुरू होने से पहले मुझे ऐसा होने की आवश्यकता है .. – doug

7

मुझे नहीं लगता कि आप कर सकते हैं कि कमांड लाइन के माध्यम से (कुछ बैश हैक्स, शायद बिना), लेकिन आप निश्चित रूप से है कि प्रोग्रामैटिक रूप से ऐसा कर सकते हैं:

बस एक संपत्ति -DmyPropertiesFile=/your/properties/file.properties सेट और फिर पढ़ा है कि एक के साथ Properties.load() ओवरलोड। उसके बाद, System.setProperties(yourProps) आपको जो चाहिए वह करना चाहिए।

बेशक, यह आवश्यक है कि आप इस कोड को जल्दी से हुक कर सकें ताकि आपकी संपत्ति आवश्यक होने पर उपलब्ध हो (उदाहरण के लिए, यदि main() विधि आपकी है, तो यह सही है)।

+0

मुझे नहीं लगता कि यह काम करेगा क्योंकि दोनों वेब एप्लिकेशन और log4j एप्लिकेशन को एक ही चर के उपयोग की आवश्यकता है ... – doug

0

यदि आप जावा प्रक्रिया को लैनच करने के लिए चींटी का उपयोग करते हैं, तो 9 000 का उत्तर (साथ ही उसकी विंडोज़ टिप्पणी) काम करेगा, और आपके पास ओएस अंतर के साथ लॉन्चर सौदा हो सकता है।

वहाँ एक StackOverflow धागा here जो बताती है कि चींटी

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