यह कोई भोला सवाल नहीं है; कृपया मेरा साथ दें।
क्या कोई मुझे बता सकता है कि /usr/bin/java
Apple JDK और Oracle 1.8.0 JDK दोनों के साथ Apple MacBook Pro पर 2010 में Oracle 1.8.0 JDK में परिणाम कैसे मिले और इस्तेमाल किया जा रहा है?
कृपया ध्यान दें कि Apple द्वारा स्थापित JDK 1.6 का मेरा संस्करण हाल ही में पर्याप्त है कि जावा प्राथमिकताएं एप्लिकेशन उनके द्वारा हटा दी गई हैं, ताकि जावा वीएम का उपयोग करने के निर्धारण में कोई कारक न हो।
इसके अलावा कृपया ध्यान दें कि /usr/libexec/java_home
नीचे मेरे किसी भी उदाहरण में (मेरे द्वारा, वैसे भी) आह्वान नहीं किया गया है।
ठीक है चले हम।
Oracle का JDK 1.8 में स्थापित हो जाता है /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/
। ठीक।
/usr/bin/java
, जो कि Apple के नियंत्रण में है, एक सांकेतिक लिंक है जो इंगित करता है /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java
। ( /System/Library/Frameworks/JavaVM.framework/Versions/Current
एक सांकेतिक लिंक /System/Library/Frameworks/JavaVM.framework/Versions/A
(निर्देशिका) की ओर इशारा करता है , इसलिए, विस्तार से, /usr/bin/java
प्रतीकात्मक लिंक संकल्प बिंदुओं के बाद /System/Library/Frameworks/JavaVM.framework/Versions/A/Commands/java
)।
/System/Library/Frameworks/JavaVM.framework/Versions/A/Commands/java
है न एक प्रतीकात्मक कड़ी। यह एक निष्पादन योग्य है। इसका अंतिम संशोधित टाइमस्टैम्प काफी पुराना है, संभवत: जब मैंने कुछ समय पहले JDK 7 स्थापित किया था। किसी भी घटना में, यह उस तारीख के अनुरूप नहीं है जिस पर मैंने जेडीके 8 स्थापित किया था।
/Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/bin/java
के आकार के बराबर नहीं है /System/Library/Frameworks/JavaVM.framework/Versions/A/Commands/java
। यह प्रतीकात्मक लिंक भी नहीं है। इसका अंतिम संशोधित टाइमस्टैम्प जब मैं JDK 8 स्थापित करता है, तब से मेल खाती है। ये दोनों अलग-अलग कार्यक्रम हैं।
फिर भी, इन दोनों में से किसी भी java
संस्करण को एक -version
तर्क के साथ लागू करने से एक संस्करण स्ट्रिंग प्राप्त होता है जो उन्हें 1.8 के रूप में पहचानता है।
शब्दार्थ लिंक को कैसे /System/Library/Frameworks/JavaVM.framework/Versions/A/Commands/java
और के बीच स्थापित किया/Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/bin/java
गया है, यह देखते हुए कि न तो दूसरे के लिए एक प्रतीकात्मक लिंक है?
दूसरे, कौन "मालिक" /System/Library/Frameworks/JavaVM.framework/Versions/A
: ओरेकल या एप्पल?
इसके अलावा, निम्नलिखित आउटपुट पर विचार करें, विशेष रूप से प्रोग्राम नाम के रूप में argv[0]
पहचान करने वाली सेटिंग /usr/bin/java
, भले ही मैंने कभी टाइप न किया हो (पंक्ति 13 नीचे दिए गए आउटपुट में:
Laird-Nelsons-MacBook-Pro:repository ljnelson$ env _JAVA_LAUNCHER_DEBUG=true /System/Library/Frameworks/JavaVM.framework/Versions/A/Commands/java -version
----_JAVA_LAUNCHER_DEBUG----
Launcher state:
debug:on
javargs:off
program name:java
launcher name:java
javaw:off
fullversion:1.8.0-b132
dotversion:1.8
ergo_policy:DEFAULT_ERGONOMICS_POLICY
Command line args:
argv[0] = /usr/bin/java
argv[1] = -version
JRE path is /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home/jre
jvm.cfg[0] = ->-server<-
jvm.cfg[1] = ->-client<-
69 micro seconds to parse jvm.cfg
Default VM: server
Does `/Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home/jre/lib/server/libjvm.dylib' exist ... yes.
----_JAVA_LAUNCHER_DEBUG----
Launcher state:
debug:on
javargs:off
program name:java
launcher name:java
javaw:off
fullversion:1.8.0-b132
dotversion:1.8
ergo_policy:DEFAULT_ERGONOMICS_POLICY
Command line args:
argv[0] = /usr/bin/java
argv[1] = -version
JRE path is /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home/jre
jvm.cfg[0] = ->-server<-
jvm.cfg[1] = ->-client<-
33 micro seconds to parse jvm.cfg
Default VM: server
Does `/Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home/jre/lib/server/libjvm.dylib' exist ... yes.
JVM path is /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home/jre/lib/server/libjvm.dylib
2242 micro seconds to LoadJavaVM
JavaVM args:
version 0x00010002, ignoreUnrecognized is JNI_FALSE, nOptions is 4
option[ 0] = '-Dsun.java.launcher.diag=true'
option[ 1] = '-Dsun.java.launcher.diag=true'
option[ 2] = '-Djava.class.path=.'
option[ 3] = '-Dsun.java.launcher=SUN_STANDARD'
Picked up _JAVA_OPTIONS: -Dfile.encoding=UTF-8
java version "1.8.0"
Java(TM) SE Runtime Environment (build 1.8.0-b132)
Java HotSpot(TM) 64-Bit Server VM (build 25.0-b70, mixed mode)
/System/Library/Frameworks/JavaVM.framework/Versions/A/Commands/java
और /usr/libexec/java_home
एक निजी रूपरेखा बुलाया लागू अंत JavaLaunching
है, जो undocumented है। इस पर दौड़ने strings
से पता चलता है कि यह एक साधारण बेवकूफ स्कैन (!) /Library/Java/JavaVirtualMachines
करता है और फिर कुछ (अनिर्दिष्ट) अनुमानी का उपयोग करता है जो सबसे हाल का है। कुरूप और आश्चर्य।