Oracle का JVM केवल एक स्थान पर स्थापित है। आपको गुमराह किया गया है!
जैसा कि आपने नोट किया है, जावा /usr/bin
. में कमांड करता है /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands
में बायनेरिज़ के लिए सिम्लिंक हैं . उस निर्देशिका के भीतर बायनेरिज़ स्टब अनुप्रयोग हैं जो यह निर्धारित करते हैं कि किस जावा वीएम का उपयोग करना है*, और फिर उस वीएम संस्करण के भीतर संबंधित वास्तविक बाइनरी को निष्पादित करें। यही कारण है कि /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands
के भीतर सभी बायनेरिज़ आकार में लगभग समान हैं, इस तथ्य के बावजूद कि आप उनसे काफी भिन्न कार्यक्षमता को लागू करने की अपेक्षा करेंगे।
आप dtrace
. का उपयोग करके इसे क्रिया में देख सकते हैं :
[email protected]:~$ sudo dtrace -n 'syscall::posix_spawn:entry { trace(copyinstr(arg1)); }' -c "/usr/bin/java -version"
dtrace: description 'syscall::posix_spawn:entry ' matched 1 probe
dtrace: pid 44727 has exited
CPU ID FUNCTION:NAME
8 619 posix_spawn:entry /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/bin/java
दिया गया dtrace
मंगलाचरण पथ तर्क को posix_spawn
. पर प्रिंट करता है जब इसे java -version
. द्वारा बुलाया जाता है . मेरे मामले में स्टब एप्लिकेशन को /System/Library/Java/JavaVirtualMachines/1.6.0.jdk
में Apple का Java 1.6 रनटाइम मिला है। और java
. के उस संस्करण को लागू कर रहा है आदेश।
स्टब बायनेरिज़ का एक और लाभ भी है:जब उन्हें पता चलता है कि कोई जावा वीएम स्थापित नहीं है, तो वे उपयोगकर्ता को एक स्थापित करने के लिए संकेत देंगे।
जहां तक CurrentJDK
का सवाल है सिम्लिंक, जैसा कि मैं इसे अतीत के साथ पिछली संगतता के लिए बता सकता हूं जब ऐप्पल ओएस एक्स पर जेवीएम का एकमात्र स्रोत था।
* यह निर्धारित करते समय कारकों के संयोजन पर विचार किया जाता है कि किस जावा वीएम का उपयोग किया जाना चाहिए। JAVA_HOME
सेट होने पर उपयोग किया जाता है (कोशिश करें JAVA_HOME=/tmp java
) अगर JAVA_HOME
सेट नहीं है तो सिस्टम पर सभी वर्चुअल मशीनों की सूची की खोज की जाती है। JAVA_VERSION
और JAVA_ARCH
वर्चुअल मशीन की सूची को किसी विशेष संस्करण और समर्थित आर्किटेक्चर में फ़िल्टर करने के लिए, यदि सेट किया गया है, तो पर्यावरण चर का उपयोग किया जाता है। परिणामी सूची को तब आर्किटेक्चर (32-बिट से अधिक 64-बिट पसंद करते हुए) और संस्करण (नया बेहतर है) द्वारा क्रमबद्ध किया जाता है, और सबसे अच्छा मैच वापस कर दिया जाता है।