दिलचस्प पोस्ट
आर में फ्लोटिंग-पॉइंट परिशुद्धता में चरम संख्यात्मक मान स्विफ्ट के साथ एक यादृच्छिक पृष्ठभूमि रंग कैसे बनाएं जावास्क्रिप्ट में नकल सेट? मैं setTimeout () कॉलबैक में एक पैरामीटर कैसे पास कर सकता हूं? हैंडलिंग का नाम: svn vs. git vs. mercurial PHP के उपयोग से छवि के साथ पारदर्शी पीएनजी कैसे मर्ज करें? एंड्रॉइड स्टूडियो: कंपाइलर त्रुटि आउटपुट विंडो कहां है? रेल पर रूबी: किसी प्रपत्र में एक सरणी सबमिट करना (… ()) बनाम (…) () जावास्क्रिप्ट बंद करने में कंसोल ऐप के 'मेन' ​​विधि पर 'एएसआईएनसीसी' संशोधक को निर्दिष्ट नहीं किया जा सकता कोई पैरामीटर व्यवहार के साथ सी फ़ंक्शन नहीं PHP, MySQL त्रुटि: स्तंभ गिनती पंक्ति 1 पर मान गणना से मेल नहीं खाती सोलर सटीक शब्द खोज MANIFEST.in "Python setup.py install" पर ध्यान नहीं दिया गया – कोई डेटा फ़ाइलों को स्थापित नहीं किया गया? किसी प्रोजेक्ट से कोकोपॉड को कैसे निकालना है?

जावा से रनटाइम पर एक वातावरण चर सेट करना संभव है?

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

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

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

धन्यवाद।

संपादित करें: ठीक है, मैं इसे इस तरह से डाल देता हूं – क्या हम जावा के साथ निम्न कार्य कर सकते हैं? कृपया उत्तर दीजिये।

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

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

Solutions Collecting From Web of "जावा से रनटाइम पर एक वातावरण चर सेट करना संभव है?"

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

यदि यह ऐसा नहीं है जो आप प्राप्त करने की कोशिश कर रहे हैं तो कृपया इस उत्तर को छोड़ दें।


अद्यतन करें

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

  1. क्या हम मौजूदा प्रक्रिया के माहौल को संशोधित कर सकते हैं?
    • आसानी से नहीं यह निर्भर करता है कि क्या आप प्रोसेस 'पर्यावरण को बदलना चाहते हैं, System.getenv() बदला जा सकता है।
    • जैसा कि ग्रेग हेगिल ने बताया, मौजूदा प्रक्रिया को बदलने के लिए आप setenv जरिए setenv या इसके प्लेटफॉर्म-विशिष्ट समकक्ष को कॉल कर सकते हैं। आप निम्न बिंदु 2 से अत्यंत जटिल विधि भी काम कर सकते हैं, जो किसी भी प्रक्रिया के लिए काम करती है (यदि आपके पास अनुमति है।) हालांकि, जागरूक रहें कि अधिकांश जेवीएम में यह परिवर्तन System.getenv() द्वारा लौटाए गए मूल्यों में कभी भी प्रतिबिंबित नहीं होगा। , जैसा कि जावास्क्रिप्ट में वर्चुअल मशीन स्टार्टअप पर कैश की तुलना में पर्यावरण अधिक बार होता है। java.util.Map (या समकक्ष।)
    • पर्यावरण के जेवीएम की कैश्ड प्रति को बदलने के लिए, जब कैश का उपयोग किया जाता है ( System.java में जो भी जेवीएम वितरण में स्रोत कोड को तैनात किया जाएगा, देखें), तो आप कार्यान्वयन (क्लास लोडिंग ऑर्डर, प्रतिबिंब , या इंस्ट्रूमेंटेशन ।) एसएनएस v1.6 JVM के मामले में, उदाहरण के लिए, पर्यावरण कैश को undocumented ProcessEnvironment वर्ग (जो आप पैच कर सकते हैं) द्वारा प्रबंधित किया जाता है।
  2. क्या हम मूल प्रक्रिया के वातावरण को संशोधित कर सकते हैं?
    • अत्यंत कठिन, और अत्यधिक गैर-पोर्टेबल । यदि आप पूरी तरह से और असल में हैं, तो बहुत विशिष्ट हैंक्स हैं जिनका उपयोग आप कर सकते हैं:
      • Windows: गतिशील रूप से रिमोट प्रक्रिया के पर्यावरण चर जोड़ें / संपादित करें
      • * निकस: क्या कोई अन्य प्रक्रिया का परिवेश चर बदलने का कोई तरीका है? – यह एक निष्पादक हत्यारा है, क्योंकि gdb द्वारा किसी भी प्रक्रिया का उपयोग किसी गैर-शून्य राशि के लिए निलंबित किया जाएगा।
  3. क्या हम बाल प्रक्रिया के माहौल को संशोधित कर सकते हैं?
    • हां , ProcessBuilder माध्यम से प्रक्रिया शुरू होने पर
    • अगर पर्यावरण परिवर्तन की आवश्यकता होती है, तो इस प्रक्रिया को पहले से ही पैदा किया जा सकता है, तो आपको विधि 2 से ऊपर (या कुछ समान रूप से जटिल विधि, जैसे कि समय-समय पर कोड-इंजेक्शन की ज़रूरत होती है, जैसे मूल प्रक्रिया द्वारा सॉकेट को नियंत्रित किया जाता है।)

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

आपके अद्यतित प्रश्न के जवाब में:

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

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

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

आप प्रोसेसन पर्यावरण पर रखे हुए अंतर्निहित मैप पर एक हैंडल प्राप्त कर सकते हैं, और फिर नई चीजें डाल सकते हैं और सामान जो आप चाहें हटा सकते हैं।

यह जावा 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); } 

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

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