2009-02-24 7 views
30

क्या जावा एप्लिकेशन से रनटाइम पर पर्यावरण चर सेट करना संभव है? जावा 1.5 java.lang.System कक्षा में है getenv() विधि, मैं केवल एक setenv() विधि की आवश्यकता होगी ...जावा से रनटाइम पर एक पर्यावरण चर सेट करना संभव है?

यह जावा प्रक्रिया अपने आप में वातावरण चर को संशोधित करने के लिए संभव है; बाल प्रक्रिया में नहीं।

क्या जेएनआई के माध्यम से इसे हासिल करना संभव है? और यह कैसे काम करेगा?

धन्यवाद।

संपादित करें: ठीक है मुझे इसे इस तरह से रखने दें - क्या हम जावा के साथ निम्नलिखित कर सकते हैं। कृपया उत्तर दीजिये।

  1. क्या हम वर्तमान प्रक्रिया के माहौल को संशोधित कर सकते हैं?
  2. क्या हम मूल प्रक्रिया के पर्यावरण को संशोधित कर सकते हैं?
  3. क्या हम बच्चे की प्रक्रिया के माहौल को संशोधित कर सकते हैं?

हेमल पांड्या ने जवाब दिया है कि "आप वर्तमान और बाल प्रक्रियाओं के पर्यावरण को संशोधित कर सकते हैं लेकिन इस प्रक्रिया को उत्पन्न करने वाली मूल प्रक्रिया के बारे में नहीं।" क्या आप इस बात से सहमत हैं ?

+0

आप विकी को प्राप्त करने की क्या कोशिश कर रहे हैं? – OscarRyz

+0

मुझे संदेह है कि यह प्रश्न इस पिछले प्रश्न से बहुत करीबी से संबंधित है: http://stackoverflow.com/questions/529474/how-to-run-a-ksh-script-from-java-code –

+0

और यह प्रश्न: http: //stackoverflow.com/questions/525212/how-to-run-unix-shell-script-from-java-code –

उत्तर

1

मुझे ऐसा नहीं लगता है, कम से कम जावा में पूरी तरह से नहीं, लेकिन आपको ऐसा करने की आवश्यकता क्यों है? जावा में System.getProperties() के माध्यम से गुणों का उपयोग करना बेहतर है, जिसे आप संशोधित कर सकते हैं।

यदि आपको वास्तव में जरूरी है, तो मुझे यकीन है कि आप जेएनआई कॉल में सी setenv फ़ंक्शन को लपेट सकते हैं - वास्तव में, अगर कोई पहले से ऐसा कर चुका है तो मुझे आश्चर्य नहीं होगा। हालांकि, मुझे कोड के विवरण नहीं पता हैं।

32

मेरे अंतर्ज्ञान सही है, और आप वास्तव में एक पैदा की (काँटेदार) उप-प्रक्रिया (Runtime.getRuntime().exec()) के लाभ के लिए वातावरण को संशोधित करना चाहते हैं, तो ProcessBuilder बजाय exec() का उपयोग करें। आप अपने ProcessBuilder इंस्टेंस की environment() विधि के माध्यम से एक कस्टम वातावरण बना सकते हैं।

यदि यह नहीं है जिसे आप प्राप्त करने का प्रयास कर रहे हैं तो कृपया इस उत्तर की उपेक्षा करें।

  1. हम मौजूदा प्रक्रिया के वातावरण को संशोधित कर सकते हैं:


    अद्यतन

    जवाब आपके तीन अद्यतन, विशिष्ट प्रश्न के लिए इस प्रकार है?

    • आसानी से नहीं। निर्भर करता है कि क्या आप एक ही JVM, या दोनों में System.getenv() द्वारा लौटाए गए मूल्य को बदलने के लिए प्रक्रिया 'पर्यावरण को बदलना चाहते हैं या नहीं।
    • ग्रेग Hewgill के रूप में बताया, वर्तमान प्रक्रिया 'पर्यावरण आप setenv और JNI के माध्यम से अपने प्लेटफ़ॉर्म-विशिष्ट बराबर कॉल कर सकते हैं बदलने के लिए।आप बिंदु 2 से बहुत ही जटिल विधि को भी नियोजित कर सकते हैं, जो कि किसी भी प्रक्रिया के लिए काम करता है (बशर्ते आपके पास अनुमतियां हों।) हालांकि, जागरूक रहें कि अधिकांश जेवीएम में यह परिवर्तन कभी भी System.getenv() द्वारा दिए गए मानों में कभी दिखाई नहीं दे सकता है, पर्यावरण के लिए अधिक बार की तुलना में एक java.util.Map में आभासी मशीन स्टार्टअप पर कैश नहीं है (या समतुल्य।)
    • पर्यावरण, जब एक कैश प्रयोग किया जाता है की JVM के कैश की गई प्रतिलिपि को बदलने के लिए (जो भी JVM वितरण में System.java में स्रोत कोड देख आप तैनाती के लिए उपयोग किया जाएगा), आप कार्यान्वयन हैकिंग (क्लास लोडिंग ऑर्डर, reflection, या instrumentation के माध्यम से) का प्रयास कर सकते हैं।) सूर्य के v1.6 JVM के मामले में, उदाहरण के लिए, पर्यावरण कैश को अनियंत्रित ProcessEnvironment कक्षा (जिसे आप पी कर सकते हैं एटीएच।)
  2. क्या हम मूल प्रक्रिया के पर्यावरण को संशोधित कर सकते हैं?
    • बेहद मुश्किल, और अत्यधिक गैर पोर्टेबल। यह एक प्रदर्शन हत्यारा है, के रूप में gdb द्वारा instrumented किसी भी प्रक्रिया निलंबित कर दिया जाएगा - Is there a way to change another process’s environment variables?:
      • विंडोज: Dynamically Add/Edit Environment variables of Remote process
      • * nix आप पूरी तरह और लाजि़मी है, तो वहाँ बहुत विशिष्ट हैक्स है कि आप का उपयोग कर सकते हैं एक गैर-शून्य समय के लिए।
  3. हम बच्चे की प्रक्रिया के वातावरण को संशोधित कर सकते हैं?
    • हाँ, प्रक्रिया के दौरान ProcessBuilder के माध्यम से।
    • यदि पर्यावरण परिवर्तन की आवश्यकता होने पर प्रक्रिया पहले से ही उत्पन्न हो चुकी है, तो आपको विधि 2 ऊपर (या कुछ समान रूप से घुलनशील विधि, जैसे स्पॉन समय पर कोड-इंजेक्शन, पूर्ववर्ती रूप से पैरेंट प्रक्रिया द्वारा सॉकेट के माध्यम से नियंत्रित किया जाना चाहिए।)

ध्यान दें कि उपरोक्त सभी तरीकों, ProcessBuilder से जुड़े एक, के अलावा भंगुर होते हैं, त्रुटियों की संभावना है, विभिन्न डिग्री करने के लिए गैर पोर्टेबल, और मल्टी-थ्रेडेड वातावरण में स्थिति दौड़ के लिए प्रवण।

+0

मुझे विश्वास है कि आपकी अंतर्ज्ञान है सही, विकी सप्ताह के लिए इस समस्या को हल करने की कोशिश कर रहा है। उपरोक्त प्रश्न टिप्पणियों में संबंधित लिंक देखें। –

0

आप वर्तमान और बाल प्रक्रियाओं के माहौल को संशोधित कर सकते हैं लेकिन इस प्रक्रिया को उत्पन्न करने वाली मूल प्रक्रिया के नहीं।

5

जवाब में अपने अपडेट किए गए सवाल का:

  1. हम मौजूदा प्रक्रिया के वातावरण को संशोधित कर सकते हैं?
    हाँ, यदि आप setenv() या कुछ कॉल करने के लिए जेएनआई का उपयोग करते हैं। आपको शायद ऐसा करने की आवश्यकता नहीं है, और यह सभी स्थितियों में काम नहीं कर सकता है।
  2. क्या हम मूल प्रक्रिया के पर्यावरण को संशोधित कर सकते हैं?
    नहीं
  3. क्या हम बच्चे की प्रक्रिया के माहौल को संशोधित कर सकते हैं?
    हाँ, ProcessBuilder का उपयोग कर।
2

आप अंतर्निहित मानचित्र पर एक हैंडल प्राप्त कर सकते हैं कि ProcessEnvironment पर हो रहा है, और फिर नई सामग्री डालें और अपनी इच्छित चीज़ें हटा दें।

यह जावा 1.8.0_144 पर काम करता है। यह गारंटी नहीं दे सकता कि यह जावा के किसी भी अन्य संस्करण पर काम करता है, लेकिन शायद यह समान है यदि आपको वास्तव में रन टाइम पर पर्यावरण को बदलने की आवश्यकता है।

private static Map<String,String> getModifiableEnvironment() throws Exception{ 
    Class pe = Class.forName("java.lang.ProcessEnvironment"); 
    Method getenv = pe.getDeclaredMethod("getenv"); 
    getenv.setAccessible(true); 
    Object unmodifiableEnvironment = getenv.invoke(null); 
    Class map = Class.forName("java.util.Collections$UnmodifiableMap"); 
    Field m = map.getDeclaredField("m"); 
    m.setAccessible(true); 
    return (Map) m.get(unmodifiableEnvironment); 
} 

के बाद आप नक्शे के संदर्भ में मिलता है, बस जो कुछ भी आप चाहते हैं जोड़ सकते हैं और आप अब नियमित रूप से पुराने System.getenv ("") कॉल का उपयोग कर इसे पुनः प्राप्त कर सकते हैं।

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