2013-02-27 24 views
33

मैं कई वर्षों से ओएस एक्स पर जावा का उपयोग कर रहा हूं और हाल ही में जब ऐप्पल ने डिफ़ॉल्ट रूप से जावा सहित बंद कर दिया था तो मैंने ओएस को जाने और इसे मेरे लिए इंस्टॉल किया (ऐप्पल की विविधता, निश्चित रूप से)।मैक पर ओरेकल के जावा को समझना

तो अब मैं ओएस एक्स 10.8 का उपयोग कर रहा हूं और मुझे जावा 7 स्थापित करने की आवश्यकता है, इसलिए मुझे अभी डीआरजी फॉर्म में ओरेकल का अपडेट 15 मिला और इंस्टॉलर चला गया। यहां यह बात करने के लिए मेरी/usr/bin/जावा (और संबंधित फ़ाइलें) अद्यतन:

/System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java 

'वर्तमान' को '/System/Library/Frameworks/JavaVM.framework/Versions' सब कुछ करने के लिए इस वापस ट्रेसिंग या तो अंक या 'CurrentJDK', पूर्व 'ए' का एक लिंक है (जो ओरेकल का जावा 7 है, जो मैं बता सकता हूं, यह सुनिश्चित नहीं है कि यह 'ए' क्यों है) और बाद में ऐप्पल के जावा 6 के लिए एक लिंक है/सिस्टम /Library/Java/JavaVirtualMachines/1.6.0.jdk '।

अब यह सब वास्तव में भ्रमित है लेकिन यह अभी तक मेरा प्रश्न भी नहीं है। ऐसा प्रतीत होता है एक जावा 7 यहां स्थापित है:

/System/Library/Frameworks/JavaVM.framework/Versions/A 

लेकिन वहाँ भी एक जावा 7 यहां स्थापित है:

/Library/Java/JavaVirtualMachines/jdk1.7.0_15.jdk 

ढूँढना जावा का अर्थ दोनों में और संस्करण की छपाई एक ही संस्करण पैदावार और बिल्ड (जावा संस्करण "1.7.0_15"), हालांकि, जब फाइलें हैंशिंग अलग हैं तो वे अलग हैं।

तो क्या इसका मतलब है ओरेकल ने जावा 7 को दो अलग-अलग स्थानों में स्थापित किया है? यदि हां, तो क्यों? मुझे किस का उपयोग करना चाहिए? और कुछ चीजें अभी भी जावा 6 (CurrentJDK) को इंगित क्यों करती हैं।

मैंने ओरेकल की वेबसाइट पर ध्यान दिया है लेकिन कुछ भी कुछ भी साफ़ नहीं करता है।

+0

वही प्रश्न पूछे जो मैं चाहता हूं। मैं वास्तव में अपने मैक में "2" जेआरई द्वारा उलझन में था। आपका विवरण स्पष्ट और साफ है। पूछने के लिए धन्यवाद :) –

उत्तर

56

ओरेकल का जेवीएम केवल एक ही स्थान पर स्थापित है। आप गुमराह हो गए हैं!

जैसा कि आपने नोट किया है, /usr/bin में जावा कमांड /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands में बाइनरी के लिए सिम्लिंक हैं। उस निर्देशिका के भीतर बाइनरी स्टब अनुप्रयोग हैं जो निर्धारित करते हैं कि कौन से जावा वीएम का उपयोग *, और फिर उस वीएम संस्करण के भीतर संबंधित असली बाइनरी निष्पादित करें। यही कारण है कि /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands के भीतर सभी बाइनरी इस तथ्य के बावजूद आकार में लगभग समान हैं, कि आप उन्हें अपेक्षाकृत विभिन्न कार्यक्षमता को लागू करने की अपेक्षा करेंगे। posix_spawn को

[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 मंगलाचरण बाहर पथ तर्क प्रिंट जब यह java -version द्वारा कहा जाता है:

आप dtrace का उपयोग करके कार्रवाई में देख सकते हैं। मेरे मामले में स्टब एप्लिकेशन ने /System/Library/Java/JavaVirtualMachines/1.6.0.jdk में ऐप्पल के जावा 1.6 रनटाइम को पाया है और java कमांड का उस संस्करण का आह्वान कर रहा है।

स्टब बाइनरी का भी एक और लाभ होता है: जब उन्हें पता चलता है कि कोई जावा वीएम स्थापित नहीं है, तो वे उपयोगकर्ता को एक स्थापित करने के लिए संकेत देंगे।

CurrentJDK सिमलिंक का सवाल है, सबसे अच्छा के रूप में मैं अतीत के साथ पीछे की ओर अनुकूलता की खातिर इस बता सकते हैं के रूप में जब एप्पल ओएस एक्स


पर JVM का एकमात्र स्रोत था * का एक संयोजन यह निर्धारित करते समय कारक पर विचार किया जाता है कि कौन सा जावा वीएम इस्तेमाल किया जाना चाहिए। सेट होने पर JAVA_HOME का उपयोग किया जाता है (JAVA_HOME=/tmp java आज़माएं)।यदि JAVA_HOME सेट नहीं है तो सिस्टम पर सभी वर्चुअल मशीनों की सूची खोजी गई है। JAVA_VERSION और JAVA_ARCH वर्चुअल चर का उपयोग किसी विशेष संस्करण और समर्थित आर्किटेक्चर में वर्चुअल मशीनों की सूची को फ़िल्टर करने के लिए किया जाता है, तो सेट किया जाता है। परिणामस्वरूप सूची को आर्किटेक्चर द्वारा क्रमबद्ध किया जाता है (32-बिट से 64-बिट पसंद करते हैं) और संस्करण (नया बेहतर होता है), और सबसे अच्छा मिलान वापस कर दिया जाता है।

+1

बहुत बहुत धन्यवाद, मैंने फ़ाइलों के आकार को देखने के लिए भी सोचा नहीं था। मैं अपने आप पर थोड़ा और जांच कर सकता हूं, लेकिन जहां आप कहते हैं "स्टब एप्लिकेशन जो निर्धारित करते हैं कि कौन से जावा वीएम का उपयोग करना है" ... वे इस दृढ़ संकल्प को कैसे बनाते हैं? उम्मीद है कि यह जावा-एचओएमई के साथ है लेकिन शायद कुछ और? – rjcarr

+1

कारकों का एक संयोजन माना जाता है। सेट करने पर JAVA_HOME का उपयोग किया जाता है ('JAVA_HOME =/tmp java'' आज़माएं)। यदि JAVA_HOME सेट नहीं है तो सिस्टम पर सभी आभासी मशीनों की सूची की खोज की जाती है। JAVA_VERSION और JAVA_ARCH पर्यावरण चर का उपयोग वर्चुअल मशीनों की सूची को किसी विशेष संस्करण और समर्थित आर्किटेक्चर में फ़िल्टर करने के लिए किया जाता है। परिणामस्वरूप सूची को आर्किटेक्चर द्वारा क्रमबद्ध किया जाता है (32-बिट से 64-बिट पसंद करते हैं) और संस्करण (नया बेहतर होता है), और सबसे अच्छा मिलान वापस कर दिया जाता है। – bdash

8

ओरेकल जावा 7 JRE (अर्थात ऐसा एप्लेट और जावा वेब प्रारंभ चलाने के लिए वेब ब्राउज़र प्लगइन द्वारा प्रयोग किया जाता है) /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home में ही स्थापित है, और यह इस एक है कि किसी भी स्वत: अद्यतन को प्रभावित करेगा है। जेडीके (जिसे आप http://www.oracle.com/technetwork/java/javase/downloads/index.html से डाउनलोड करते हैं) /Library/Java/JavaVirtualMachines के अंतर्गत निर्देशिका बनाकर स्थापित करता है, और यह आपके लिए यह अपडेट करने के लिए है। आप कई जेडीके संस्करणों को एक साथ स्थापित कर सकते हैं लेकिन JavaAppletPlugin.plugin के तहत केवल एक "सार्वजनिक" जेआरई (जो नवीनतम स्थापित जेडीके या बाद के संस्करण के अनुरूप होगा यदि इसे तब से स्वतः अपडेट किया गया है)।

bdash द्वारा समझाया, /usr/bin तहत आदेशों स्टब्स कि प्रतिनिधि के लिए जो भी JDK/JRE की ओर इशारा किया है JAVA_HOME वातावरण चर द्वारा कर रहे हैं, या यदि वह सेट नहीं है तो वे चलाने के लिए सबसे उपयुक्त जावा का चुनाव करेगा। आप /usr/libexec/java_home का उपयोग यह देखने के लिए कर सकते हैं कि कौन से स्टब्स चुनेंगे। यदि नहीं जावा स्थापित है तो स्टब्स नवीनतम ऐप्पल जावा 6 स्थापित करने की पेशकश करेगा (जहां तक ​​मुझे पता है कि वे जावा 7 स्थापित करने की पेशकश नहीं करेंगे)।

+0

स्पष्टीकरण के लिए धन्यवाद और यह समझ में आता है। मुझे यह सुनिश्चित करने के लिए JAVA_HOME var और java_home bin का परीक्षण करना होगा कि मैं इसे अपेक्षित रूप से काम करने के लिए प्राप्त कर सकता हूं। – rjcarr

+0

@rjcarr मुझे एहसास हुआ कि मेरा जवाब पूरी तरह स्पष्ट नहीं था - स्टब्स हमेशा JAVA_HOME का सम्मान करेंगे - चल रहे '/ usr/libexec/java_home' आपको दिखाएंगे कि JAVA_HOME _not_ सेट होने पर कौन सा विकल्प उठाएगा। –

+1

@bdash और इयान ने वास्तव में आपके उत्तरों की सराहना की। मैं इस पोस्ट पर एक अलग कारण के लिए पहुंचा, मैं विभिन्न जावामिंक्स और स्टब्स को उलझन/गलतफहमी से अपने जावा इंस्टॉल को गड़बड़ करने में कामयाब रहा। यदि अन्य लोगों ने इस समस्या को मारा, तो चींटी चलाने के दौरान मेरी त्रुटियां "java.lang.No.NoassassDefFoundError: sun.util.calendar.ZoneInfoFile, sun.util.calendar.ZoneInfo.getTimeZone (ZoneInfo.java:663) पर क्लास प्रारंभ नहीं कर सका। और "इससे पहले एक त्रुटि हुई है: java.lang.AssertionError: प्लेटफॉर्म sun.nio.fs.DefaultFileSystemProvider.create (DefaultFileSystemProvider.java:73) पर पहचाना नहीं गया है" - पुhew! –

3

मैं इस पोस्ट को खोजने: https://developer.apple.com/library/mac/qa/qa1170/_index.html /usr/libexec/JAVA_HOME उपकरण गतिशील शीर्ष जावा संस्करण वर्तमान उपयोगकर्ता के लिए जावा पसंद में निर्दिष्ट पाता है।

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