2012-04-11 5 views
23

चूंकि सार्वजनिक जावा 6 एसई जेआरई इसके ईओएल (नवंबर '12) के करीब आ रहा है, इसलिए मैं जावा 6 से जावा 7 तक अपनी परियोजनाओं को पोर्ट करने पर विचार कर रहा हूं। यह एक बड़ा सौदा नहीं होगा, अगर ऐप्पल जावा प्रदान करेगा मैक ओएस एक्स के लिए 7 जेआरई लेकिन चूंकि ऐप्पल ऐसा करने को तैयार नहीं है, इसलिए मुझे अभी भी उन उपयोगकर्ताओं का समर्थन करना है जिनके पास केवल जावा 6 जेआरई है।क्या जावा 7 एसडीके के साथ क्लास फाइलों को संकलित करना संभव है जो जावा 6 जेवीएम पर चल सकता है?

जावा 7 जावा के साथ जावा 6 संगत बाइनरी (क्लास फाइल) को संकलित करने का कोई तरीका है? निश्चित रूप से मुझे पता है कि ऐसा करने पर मैं नई जावा 7 सुविधाओं का उपयोग नहीं कर सकता।

प्रत्याशा में धन्यवाद!

+1

संबंधित: http://stackoverflow.com/questions/4061965/if-i-compiled-a-java-file-in-the-newest-jdk-would-an-older-jvm-be-able-to -रुन-टी – assylias

+0

[संभव चींटी बूटक्लासपैथ सेट करें: जेडीके 1.7 में बूटप्लासपैथ के बिना पुराने स्रोत को सेट करने के लिए एक नई जावैक चेतावनी है] (http://stackoverflow.com/questions/7260697/set-ant-bootclasspath-jdk-1 -7-has-a-new-javac-warning-for-setup-an-old-sour) –

+0

http://stackoverflow.com/questions/7661980/compiling-java-7-to-java-6 – karmakaze

उत्तर

21

यह निर्भर करता है। यदि आपका प्रोग्राम नए जावा 7 भाषा एक्सटेंशन का उपयोग नहीं करता है, तो आप जावा कंपाइलर को -source 1.6 और -target 1.6 विकल्पों के साथ चला सकते हैं। लेकिन यदि आप जावा 7 भाषा एक्सटेंशन का उपयोग करते हैं तो -source 1.6 परिणाम संकलन त्रुटियों में होगा।

निश्चित रूप से मुझे पता है कि ऐसा करने पर मैं नई जावा 7 सुविधाओं का उपयोग नहीं कर सकता।

इसमें जावा 7 भाषा विशेषताएं शामिल हैं ... और जावा 7 पर निर्भरता मानक कक्षा लाइब्रेरी एपीआई में बदलती है। यह भी ध्यान रखें कि बहुत कम व्यवहारिक अंतर (उर्फ एपीआई बग फिक्स) हैं जो जावा 6 और जावा 7 पर अलग-अलग चलाने के लिए कोड का कारण बन सकते हैं। उन्हें जावा 6 में जावा 7 संक्रमण दस्तावेज़ में वर्णित किया जाना चाहिए।


अद्यतन - यह शायद नहीं रह गया है आप के लिए एक मुद्दा वैसे भी, क्योंकि ओरेकल मैक OSX के लिए जावा 7 जारी किया है।

+0

यदि आपको अभी भी इसके साथ त्रुटियां मिल रही हैं, तो आप अस्थायी रूप से जावा पर वापस स्विच कर सकते हैं। '/ Usr/libexec/java_home -v' 1.6 * ''चलाकर पथ खोजें। फिर, इसे 'निर्यात JAVA_HOME = "/ पथ/से/java6 /" 'का उपयोग कर जावा होम पथ के रूप में सेट करें। सत्यापित करें कि यह 'जावा-वर्जन' चलाकर काम करता है। – user2398029

+0

@ लुइसिज्म - विंडोज और लिनक्स (कम से कम) सेटिंग पर JAVA_HOME सीधे 'जावा' चलाने पर कमांड चलाने पर प्रभाव नहीं डालता है। मैक ओएसएक्स अलग है? –

+0

ऐसा लगता है! Gist.github.com/4394202 देखें। – user2398029

5

मेरे पास jdk6 स्थापित है। यदि आप javac के मैन पेज को चेक करते हैं:

Cross-Compilation Options 
      By default, classes are compiled against the bootstrap and extension classes of the platform that javac shipped with. But javac also supports cross-compil‐ 
      ing, where classes are compiled against a bootstrap and extension classes of a different Java platform implementation. It is important to use -bootclasspath 
      and -extdirs when cross-compiling; see Cross-Compilation Example below. 

     -target version 
      Generate class files that target a specified version of the VM. Class files will run on the specified target and on later versions, but not on earlier 
      versions of the VM. Valid targets are 1.1 1.2 1.3 1.4 1.5 (also 5) and 1.6 (also 6). 
3

हाँ, लेकिन कुछ मामलों में नहीं। जावा 1.6 में उनके पास संसाधनों, स्ट्रिंग्स या मल्टी कैच स्टेटमेंट इत्यादि के साथ प्रयास नहीं था। इसलिए प्रोग्राम के उन हिस्सों को संकलित नहीं किया जाएगा। लेकिन जावा का विचार एक बार संकलित है, हर जगह चलाएं; तो कोड पुराने JVMs पर काम कर सकता है

3

स्टीफन सी का उत्तर सही है, लेकिन पूरा नहीं हुआ है। जावा 7 में आपके जावा 7 प्रोग्राम संकलित नहीं होंगे यदि वे जावा 7 भाषा सुविधाओं का उपयोग करते हैं, लेकिन चेतावनी दी जा सकती है कि सूक्ष्म अन्य बग अभी भी जावा 6 में एक डेवलपर कोडिंग और जावा 6 को संकलित करने के साथ हो सकती हैं।

उदाहरण के लिए जावा चुनें। sql.Driver। जावा 7 में, इंटरफ़ेस ने एक अतिरिक्त विधि प्राप्त की।

जावा 7 डेवलपर इस डेवलपर ड्राइवर इंटरफ़ेस लागू करता है और कार्यान्वित अतिरिक्त ड्राइवर पद्धति पर 'अवहेलना' एनोटेशन का उपयोग करता है। कार्यक्रम जावा 6 प्रोग्राम के रूप में ठीक संकलित करता है क्योंकि जावा 6 कंपाइलर देखता है कि क्लास में उस विधि और कोड की जांच हो जाती है। प्रोग्राम को जावा 6 के रूप में संकलित करने का मतलब यह नहीं है कि जावा 6 कंपाइलर स्वचालित रूप से जावा 6 स्रोत का उपयोग करने के लिए स्विच हो जाएगा कोड!

जावा 6 डेवलपर जावा 6 डेवलपर कोड जावा 7 डेवलपर प्रतिबद्ध निर्माण करने के लिए प्रयास करता है और एक संकलन त्रुटि भले ही जावा 7 डेवलपर किसी भी जावा 7 भाषा निर्माणों को लागू नहीं किया गया था हो जाता है।

नतीजतन, भले ही आप इसे जावा 6 के रूप में संकलित कर सकें, तो मैं ऐसा करने की अनुशंसा नहीं करता।

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