ग्रेड, "sourceCompatibility" बनाम "targetCompatibility"?


130

रिश्ता / अंतर क्या है sourceCompatibilityऔर targetCompatibility? जब वे विभिन्न मूल्यों पर सेट होते हैं तो क्या होता है?

ग्रेडल प्रलेखन के अनुसार :

sourceCompatibilityजावा स्रोत को संकलित करते समय "जावा संस्करण संगतता का उपयोग करना है।" targetCompatibilityके लिए कक्षाएं उत्पन्न करने के लिए "जावा संस्करण है।"

मेरी समझ यह है कि targetCompatibilityजावा बाइटकोड उत्पन्न करेगा जो जावा के एक विशिष्ट संस्करण के साथ संगत है, क्या यह कार्यक्षमता का सबसेट है sourceCompatibility?

जवाबों:


80

targetCompatibilityऔर javac में और sourceCompatibilityकरने के लिए नक्शे । स्रोत मूल रूप से स्रोत भाषा का स्तर है और लक्ष्य बाइटकोड का स्तर है जो उत्पन्न होता है।-target release-source release

अधिक विवरण javac पार संकलन अनुभाग में पाया जा सकता है ।


1
उपरोक्त लिंक जावा 7 के लिए डॉक्टर की ओर इशारा कर रहा है। मुझे आश्चर्य है कि क्या आप डॉक्स.कोरल . com/en/java/javase/11/tools/… जैसा कुछ चाहते हैं ?
ब्रायन एग्न्यू

63

जब आप इन का उपयोग करते हैं तो सावधान रहें; हम लोगों द्वारा मान्यताओं को काट दिया गया है।

सिर्फ इसलिए कि आप 1.5 के sourceCompability (या targetCompatibility) का उपयोग करते हैं, इसका मतलब यह नहीं है कि आप हमेशा JDK 1.6 के साथ अपने कोड को संकलित कर सकते हैं और उम्मीद कर सकते हैं कि यह JDK 1.5 के तहत काम करेगा। मुद्दा उपलब्ध पुस्तकालयों है।

यदि आपका कोड कुछ विधि को कॉल करने के लिए होता है जो केवल JDK 1.6 में उपलब्ध है, तो यह अभी भी लक्ष्य VM के लिए विभिन्न संगतता विकल्पों के साथ संकलन करेगा। लेकिन जब आप इसे चलाते हैं, तो यह विफल हो जाएगा क्योंकि आपत्तिजनक तरीका मौजूद नहीं है (आपको एक MethodNotFoundException या ClassNotFoundException मिल जाएगी)।

इस कारण से, मैं हमेशा अपने द्वारा बनाए जा रहे वास्तविक जावा संस्करण की संगतता सेटिंग की तुलना करता हूं। यदि वे मेल नहीं खाते हैं, तो मैं निर्माण को विफल करता हूं।


4
यह एक सूक्ष्म, लेकिन बहुत महत्वपूर्ण अवलोकन है।
Natix

आप उनकी तुलना कैसे करते हैं?

आप निर्माण क्यों विफल करते हैं? इस मुद्दे को कम करने के लिए "बूटस्ट्रैप क्लासपाथ" विकल्प दिया गया है। आप हमेशा उचित बूटस्ट्रैप का उपयोग कर सकते हैं और इसे ठीक काम करना चाहिए।
कोडबेंडर

6
if(JavaVersion.current() != JavaVersion.VERSION_1_8) throw new GradleException("This project requires Java 8, but it's running on "+JavaVersion.current())यह है कि मैं इस मुद्दे को कैसे हल करता हूं, सही बिल्ड.ग्रेड फ़ाइल की शुरुआत में।
Xerus

2
जावा 9 के बाद से अब इस समस्या का समाधान करने के लिए एक नया javacविकल्प --releaseहै, केवल निर्दिष्ट जावा संस्करण में उपलब्ध एपीआई के उपयोग की अनुमति देकर। इस पर अधिक जानकारी के लिए देखें stackoverflow.com/a/43103038/4653517
जेम्स मुड

35

sourceCompatibility = जावा प्रोग्रामिंग लैंग्वेज के उस संस्करण को .java फाइलों को संकलित करने के लिए उपयोग किया जाता है । जैसे sourceCompatibility 1.6 = निर्दिष्ट करता है कि जावा प्रोग्रामिंग लैंग्वेज का संस्करण 1.6 .java फाइलों को संकलित करने के लिए उपयोग किया जाता है ।

डिफ़ॉल्ट स्रोतकम्पैटिबिलिटी = "उपयोग में वर्तमान JVM का संस्करण" और targetCompatibility = sourceCompatibility

targetCompatibility = विकल्प यह सुनिश्चित करता है कि उत्पन्न वर्ग की फाइलें लक्ष्यCompatibility द्वारा निर्दिष्ट VMs के साथ संगत होंगी। ध्यान दें कि ज्यादातर मामलों में, -getget विकल्प का मूल्य -source विकल्प का मूल्य है; उस स्थिति में, आप -getget विकल्प को छोड़ सकते हैं।

क्लास की फाइलें टार्गेट कमेटी द्वारा निर्धारित लक्ष्य और बाद के संस्करणों पर चलेंगी, लेकिन वीएम के पुराने संस्करणों पर नहीं


हम यह कैसे पता लगाते हैं कि हमारा प्रोजेक्ट कौन सा उपयोग कर रहा है?
isJulian00

0

मेरी राय में, "sourceCompatibility" का अर्थ है कि आप अपने सोर्स कोड में किस सुविधा का उपयोग कर सकते हैं। उदाहरण के लिए, यदि आपने sourceCompatibility को 1.7 पर सेट किया है, तो आप लैम्ब्डा एक्सप्रेशन का उपयोग नहीं कर सकते हैं जो java 8 में एक नया फीचर है, भले ही आप jdv संस्करण है 1.8।
जैसा कि "targetCompatibility" के लिए, इसका अर्थ है कि जेनरेट क्लास फ़ाइल के किस संस्करण को चलाया जा सकता है, यदि आप इसे 1.8 पर सेट करते हैं, तो यह सफलतापूर्वक jdk 1.7 पर नहीं चल सकता है, लेकिन यह आमतौर पर jdk के उच्च संस्करण पर चल सकता है।


0

ये जावेद कमांड के लिए झंडे हैं।

javac [options] [sourcefiles]

Options:
...
-source release - Specifies the version of source code accepted.
...
-target release - Generates class files for a specific VM version.
...

दूसरे शब्दों में: आप एक sourceसंस्करण में एक कोड लिखते हैं और अपनी कक्षाओं को targetVM संस्करण में संकलित करते हैं । पुराने जावा संस्करण के साथ अन्य वर्कस्टेशन पर इसे चलाने के लिए।

के अनुसार: https://docs.oracle.com/en/java/javase/11/tools/javac.html

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.