मैंने TMPपर्यावरण चर का उपयोग चीजों को नियंत्रित करने के लिए किया है, जहां gcc यह अस्थायी फ़ाइलें लिखता है, लेकिन मैं जावा के createTempFile API के लिए एक समान नहीं खोज सकता ।
क्या ऐसा वातावरण चर मौजूद है?
मैंने TMPपर्यावरण चर का उपयोग चीजों को नियंत्रित करने के लिए किया है, जहां gcc यह अस्थायी फ़ाइलें लिखता है, लेकिन मैं जावा के createTempFile API के लिए एक समान नहीं खोज सकता ।
क्या ऐसा वातावरण चर मौजूद है?
जवाबों:
हम्म - चूँकि यह JVM द्वारा संभाला जाता है, इसलिए मैंने OpenJDK VM स्रोत कोड में थोड़ा सा बदलाव किया, यह सोचकर कि शायद OpenJDK mimics द्वारा क्या किया गया है जो कि Java 6 और पूर्व द्वारा किया गया है। यह आश्वस्त नहीं है कि विंडोज पर इसके अलावा ऐसा करने का कोई तरीका है।
पर विंडोज , OpenJDK के get_temp_directory()कार्य करने के लिए एक Win32 API कॉल करता है GetTempPath(); यह विंडोज पर है, जावा TMPपर्यावरण चर के मूल्य को दर्शाता है ।
पर लिनक्स और सोलारिस , एक ही get_temp_directory()कार्य के लिए एक स्थिर मान /tmp/।
मैं नहीं जानता कि क्या वास्तविक JDK6 इन सटीक सम्मेलनों का अनुसरण करता है, लेकिन प्रत्येक सूचीबद्ध प्लेटफार्मों पर व्यवहार के द्वारा, ऐसा लगता है कि वे ऐसा करते हैं।
-Djava.io.tmpdirकमांड लाइन विकल्प के माध्यम से JVM के लिए), और यदि डिफ़ॉल्ट मान प्रभावित होता है सभी एक पर्यावरण मूल्य द्वारा। जैसा कि लोगों ने देखा था, विंडोज पर यह पर्यावरण चर से प्रभावित है TMP, लेकिन यह स्पष्ट नहीं था कि क्या अन्य ओएस के लिए कुछ अज्ञात चर था। ऐसा लगता है कि वहाँ नहीं है, कम से कम हमें क्या OpenJDK के बारे में पता है।
GetTempPath()केवल TMPपर्यावरण चर से प्रभावित नहीं है : msdn.microsoft.com/en-us/library/aa364992%28VS.85%29.aspx
/var/tmp/(प्रमुख स्लैश के साथ) है, उसके लिए बग # 4391434 भी है। और मैक ओएस और लिनक्स के लिए यह है/tmp - क्या गड़बड़ है!
oracle-java8-jdk=8u102(लिनक्स)
जावा डॉक्स के अनुसारjava.io.File
डिफ़ॉल्ट अस्थायी-फ़ाइल निर्देशिका को सिस्टम प्रॉपर्टी java.io.tmpdir द्वारा निर्दिष्ट किया जाता है। UNIX प्रणालियों पर इस संपत्ति का डिफ़ॉल्ट मूल्य आमतौर पर "/ tmp" या "/ var / tmp" होता है; Microsoft Windows सिस्टम पर यह आमतौर पर "c: \ temp" है। जावा वर्चुअल मशीन के आने पर इस सिस्टम प्रॉपर्टी को एक अलग मान दिया जा सकता है, लेकिन इस प्रॉपर्टी के प्रोग्रामेटिक बदलावों को इस पद्धति द्वारा उपयोग किए जाने वाले अस्थायी डायरेक्टरी पर कोई प्रभाव नहीं पड़ने की गारंटी नहीं है।
java.io.tmpdirसिस्टम प्रॉपर्टी को निर्दिष्ट करने के लिए , आप जेवीएम को निम्नानुसार लागू कर सकते हैं:
java -Djava.io.tmpdir=/path/to/tmpdir
डिफ़ॉल्ट रूप से यह मान TMPविंडोज सिस्टम पर पर्यावरण चर से आना चाहिए
java.io.tmpdirWindows SDK फ़ंक्शन GetTempPath( msdn.microsoft.com/en-us/library/aa364992%28VS.85%29.aspx ) का उपयोग करके परिभाषित किया गया है , जो TMP या TEMP या USERPROFILE या Windows निर्देशिका में से प्रत्येक के लिए हल होगा पिछला परिभाषित नहीं है।
आप अपना _JAVA_OPTIONSपर्यावरण चर सेट कर सकते हैं। उदाहरण के लिए बाश में यह चाल होगी:
export _JAVA_OPTIONS=-Djava.io.tmpdir=/new/tmp/dir
मैंने अपनी बैश लॉगिन स्क्रिप्ट में डाल दिया है और यह चाल करने के लिए लगता है।
Picked up _JAVA_OPTIONS:यह पूरी तरह से हमारी निर्माण प्रक्रिया को भ्रमित करता है।
JAVA_TOOL_OPTIONSअधिक पोर्टेबल है।
उपयोग
$ java -XshowSettings
Property settings:
java.home = /home/nisar/javadev/javasuncom/jdk1.7.0_17/jre
java.io.tmpdir = /tmp
यहाँ क्या हो रहा है इसके बारे में स्पष्ट होना:
अस्थायी निर्देशिका स्थान सेट करने का अनुशंसित तरीका "java.io.tmpdir" नामक सिस्टम गुण सेट करना है, उदाहरण -Djava.io.tmpdir=/mytempdirके लिए javaकमांड का विकल्प देकर । प्रॉपर्टी को प्रोग्राम के भीतर से कॉल करके भी बदला जा सकता है System.setProperty("java.io.tmpdir", "/mytempdir)... modulo sandbox सुरक्षा मुद्दे।
यदि आप स्टार्टअप पर "java.io.tmpdir" संपत्ति को स्पष्ट रूप से सेट नहीं करते हैं, तो JVM इसे एक प्लेटफ़ॉर्म विशिष्ट डिफ़ॉल्ट मान पर प्रारंभ करता है । Windows के लिए, डिफ़ॉल्ट को Win32 API विधि के लिए कॉल द्वारा प्राप्त किया जाता है। लिनक्स / सोलारिस के लिए डिफ़ॉल्ट रूप से स्पष्ट रूप से हार्ड-वायर्ड है। अन्य JVM के लिए यह कुछ और हो सकता है।
व्यावहारिक रूप से, "टीएमपी" पर्यावरण चर विंडोज (वर्तमान जेवीएम के साथ) पर काम करता है, लेकिन अन्य प्लेटफार्मों पर नहीं। यदि आप पोर्टेबिलिटी की परवाह करते हैं, तो आपको स्पष्ट रूप से सिस्टम प्रॉपर्टी सेट करनी चाहिए।