2012-05-19 15 views
27

जावा कंपाइलर (javac) का उपयोग करते समय, हम दो प्रकार की संगतता निर्दिष्ट कर सकते हैं। एक -source का उपयोग कर रहा है और दूसरा -target का उपयोग कर रहा है। इन दोनों के बीच क्या अंतर है?-सोर्स और-लक्ष्य अनुकूलता के बीच क्या अंतर है?

उदाहरण के लिए, -source 1.5 और -target 1.6?

साथ ही, क्या कोई ऐसा मामला है जहां हम एक अलग स्रोत और लक्षित संगतता स्तर का उपयोग करते हैं?

उत्तर

21
javac docs से

: अपने उदाहरण में

-source Specifies the version of source code accepted.

-target 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.

:

-source 1.5 and -target 1.6 

यह सुनिश्चित करें कि स्रोत कोड JDK 1.5 के साथ संगत है बनाने के लिए इस्तेमाल किया जाएगा, लेकिन उपयोग के लिए वर्ग फ़ाइलों उत्पन्न करनी चाहिए जेडीके 1.6 और बाद में।

काफी क्यों आप यह एक और मामला करेंगे।

+2

ध्यान दें कि मुझे पता चला है कि 'जावैक' सभी संयोजनों का समर्थन नहीं करता है। इसके अलावा मेरे पास वास्तव में एक उपयोग-मामला है। जावा 6 जेएक्स-डब्ल्यूएस में बनाया गया है, इसलिए मैं अतिरिक्त पुस्तकालयों के बिना सादे जावा 6 पर काम करने का समाधान करना चाहता था। उस समाधान के लिए कुछ ग्राहकों को जावा 5 जेवीएम (और जेएक्स-डब्ल्यूएस को तरफ लाया गया) पर निष्पादन योग्य होने की आवश्यकता थी और '@ ओवरराइड' सिंटैक्स बदल गया था, इसलिए यह जावा 5 जावा द्वारा तुरंत संकलित नहीं किया गया था। (यह प्री-मेवेन था, आज करना आसान हो सकता है) –

+0

यह भी देखें [-bootclasspath' जैसा कि [इस उत्तर] में वर्णित है (http://stackoverflow.com/a/10663478/418556)। –

+1

@ स्काफमैन - * "आप ऐसा क्यों करेंगे, यह एक और मामला है ..." * - जावा टिप्पणियों की व्याख्या करने की कोशिश करता है। यदि भाषाएं ठीक से सेट नहीं की गई हैं, तो संकलन टिप्पणियों में एक अवैध चरित्र की वजह से विफल हो सकता है !!! टिप्पणियों की व्याख्या करना बंद करने के लिए संकलक को कभी-कभी कहना आसान होता है, कहें, सैकड़ों फाइलों में कॉपीराइट नोटिस को ठीक करें। – jww

10

-source इंगित करता है कि आपके स्रोत कोड का अनुपालन किस स्तर पर है: क्या आप एनोटेशन का उपयोग कर रहे हैं? फिर आपको कम से कम 1.5 की आवश्यकता होगी; आप इंटरफेस कार्यान्वयन पर @override उपयोग कर रहे हैं, तो आप की आवश्यकता होगी 1.6 आदि

-target निर्दिष्ट करता है क्या जावा संस्करण आप पर अपनी कक्षाओं को चलाने के लिए सक्षम होना चाहते हैं। आप Java SE 7 कंपाइलर का उपयोग कर सकते हैं और जावा एसई 1.5 पर चलाने के लिए संकलित कर सकते हैं।

7

यह जावा के पुराने संस्करण के साथ काम कर रहे एक जार फ़ाइल का उत्पादन करने के लिए अधिकतर उपयोगी है। मेरा मानना ​​है कि अब तक सभी जेडीके पुराने संस्करण को निष्पादित करने में सक्षम हैं, इसलिए स्रोत से बड़ा लक्ष्य रखने का कोई वास्तविक कारण नहीं है।

हालांकि यह target को उदाहरण के लिए सेट करने के लिए समझ में आता है 1.6 1.7 जेडीके का उपयोग करते समय।

मुझे यकीन है कि नहीं कर रहा हूँ, लेकिन मेरा मानना ​​है कि यह इस तरह

ArrayList<Integer> foo = new ArrayList<>(); 

के रूप में है कि केवल मान्य हैं, एक 1.6 जार करने के लिए एक 1.7 संकलक का उपयोग कर एक 1.7 जावा कोड को संकलित करने के कुछ स्थितियों में काम कर सकता था उदाहरण के भाव के लिए 1.7+ स्रोत संस्करण में 1.6 संगत बाइट कोड को संकलित करना चाहिए। लेकिन मैंने यह सत्यापित नहीं किया है कि संकलक वास्तव में ऐसा करेगा या नहीं। दुर्भाग्य से, यह अभ्यास में लागू नहीं प्रतीत होता है।

+2

हालांकि यह एक अच्छा सिद्धांत है, यह वास्तव में अभ्यास में ऐसा नहीं करेगा। यदि आप स्रोत 1.7 और लक्ष्य 1.6 का प्रयास करते हैं तो आपको यह त्रुटि मिल जाएगी: "स्रोत रिलीज 1.7 को लक्ष्य रिलीज की आवश्यकता है 1.7" – Tomas

+4

मुझे पता चला कि @ टोमास सच कहता है। जो परेशान है, क्योंकि यह सबसे उपयोगी संयोजन लगता है? यह आपको 1.7 स्रोत स्तर में पुस्तकालयों को लिखने से रोकता है जिसे 1.6 परियोजनाओं में जोड़ा जा सकता है। क्या इसका कोई समाधान है? – Matthias

+0

@Matthias विभिन्न क्लासफ़ाइल संस्करणों से पुस्तकालयों को जोड़ने में कोई समस्या नहीं है। 'लक्ष्य 1.6' का उपयोग करने का एकमात्र कारण यह है कि कोड चलाने वाला JVM 1.6 है। – Nayuki

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