जावा 9 कंपाइलर में --release झंडा क्या है?


85

जावा 9 का javacनया ध्वज है --release:

> javac --help
...

--release <release>
    Compile for a specific VM version. Supported targets: 6, 7, 8, 9

यह कैसे से अलग है -sourceऔर -targetझंडे? क्या यह सिर्फ एक शॉर्टकट है -source X -target X?


मावेन के बारे में संबंधित प्रश्न : एक जावाएफ़एक्स ऐप में "
बेसिल बोर्क

जवाबों:


106

बिल्कुल नहीं।

JEP 247: पुराने प्लेटफ़ॉर्म संस्करणों के लिए संकलन इस नए कमांड-लाइन विकल्प को परिभाषित करता है--release:

हमने एक नए कमांड-लाइन विकल्प को परिभाषित किया है --release, जो स्वचालित रूप से कंपाइलर को क्लास फ़ाइलों का उत्पादन करने के लिए कॉन्फ़िगर करता है जो दिए गए प्लेटफ़ॉर्म संस्करण के कार्यान्वयन के खिलाफ लिंक करेगा। पूर्वनिर्धारित प्लेटफार्मों के लिए javac, --release Nके बराबर है-source N -target N -bootclasspath <bootclasspath-from-N> । (जोर मेरा)

तो नहीं, यह नहीं के बराबर है -source N -target N। इस जोड़ का कारण "प्रेरणा" खंड में बताया गया है:

javacदो कमांड लाइन विकल्प प्रदान करता है, -sourceऔर -target, जिसे कंपाइलर द्वारा स्वीकार की गई जावा भाषा के संस्करण और उसके द्वारा निर्मित वर्ग फ़ाइलों के संस्करण का चयन करने के लिए उपयोग किया जा सकता है। डिफ़ॉल्ट रूप से, हालांकि, javacप्लेटफ़ॉर्म एपीआई के सबसे हाल के संस्करण के खिलाफ संकलन करता है। संकलित कार्यक्रम इसलिए गलती से प्लेटफॉर्म के वर्तमान संस्करण में केवल उपलब्ध एपीआई का उपयोग कर सकता है। इस तरह के कार्यक्रम प्लेटफॉर्म के पुराने संस्करणों पर नहीं चल सकते हैं, भले ही मूल्यों को पारित किया गया हो -sourceऔर -target। विकल्प। यह एक दीर्घकालिक प्रयोज्य दर्द बिंदु है, क्योंकि उपयोगकर्ता उम्मीद करते हैं कि इन विकल्पों का उपयोग करके उन्हें कक्षा की फाइलें मिलेंगी जो निर्दिष्ट प्लेटफ़ॉर्म संस्करण पर चल सकती हैं।

संक्षेप में, स्रोत और लक्ष्य विकल्पों को निर्दिष्ट करना क्रॉस-संकलन के लिए पर्याप्त नहीं है। क्योंकि javac, डिफ़ॉल्ट रूप से, प्लेटफ़ॉर्म एपीआई के सबसे हाल के संकलनों के खिलाफ, उन्हें पुराने संस्करणों पर चलने की गारंटी नहीं दी जा सकती है। आपको -bootclasspathपुराने संस्करण के अनुरूप विकल्प को भी सही ढंग से क्रॉस-कंपाइल करने की आवश्यकता है। इसमें पुराने एपीआई को संकलित करने और पुराने संस्करण पर निष्पादन की अनुमति देने के लिए सही एपीआई संस्करण शामिल होगा। चूंकि यह बहुत बार भुला दिया गया था, इसलिए एक कमांड लाइन विकल्प को जोड़ने का निर्णय लिया गया, जिसने सभी आवश्यक चीजों को सही ढंग से क्रॉस-कंपाइल किया।

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


एक संदेह, कोड में jdk 9-11 से सुविधाओं का उपयोग करना संभव होगा और यह अभी भी जावा रनटाइम 8 पर चलता है?
क्रिस्टियानो

नहीं, वे jre 8 बाइनरी में मौजूद नहीं होंगे
Rogue

"प्लेटफ़ॉर्म एपीआई" से आप क्या करते हैं? क्या बाइट-कोड स्तर पर कुछ है? या अंतर्निहित x86 प्लेटफ़ॉर्म या OS API से संबंधित कुछ?
जोस Cifuentes

2
@JoseCifuentes, यहां "प्लेटफ़ॉर्म एपीआई" को JDK API दिया गया है, बिना --releaseझंडे के इसका संस्करण, संकलन के लिए इस्तेमाल किए जाने वाले JDK से माना जाएगा, जो आमतौर पर आपके द्वारा उपयोग किए जाने वाले JDK से भिन्न होता है -sourceऔर -target। यह आपको उस मामले में काट सकता है जब आप कभी जेडडीके में शुरू की गई कक्षाओं / विधियों का उपयोग करते हैं, तो आप जो लक्ष्य करते हैं। यह अतिरिक्त सूक्ष्म है जब कंपाइलर एक विधि अधिभार चुनता है जिसे बाद के संस्करण में पिछले एक से जोड़ा गया था जिसका इरादा था कि आप चुपचाप बाइनरी संगतता तोड़ सकते हैं।
ओलिवर गोंडाज़ा

30

--release Xकरने के लिए सिर्फ एक शॉर्टकट से भी अधिक है -source X -target Xक्योंकि -sourceऔर -targetसुरक्षित रूप से एक बड़ी रिलीज करने के लिए संकलित करने के लिए पर्याप्त नहीं हैं। आपको एक -bootclasspathध्वज सेट करने की भी आवश्यकता है जो पुराने रिलीज के अनुरूप होना चाहिए (और यह ध्वज अक्सर भूल जाता है)। तो, जावा 9 में वे एक ही बना --releaseतीन झंडे के लिए ध्वज जो एक प्रतिस्थापन है: -source, -targetऔर -bootclasspath

तो, यह जावा 1.7 के संकलन का एक उदाहरण है:

javac --release 7 <source files>

ध्यान दें कि आपको अपने कंप्यूटर पर JDK 7 स्थापित करने की आवश्यकता नहीं है। JDK 9 में पहले से ही ऐसे प्रतीकों को जोड़ने से रोकने के लिए आवश्यक जानकारी है जो JDK 7 में मौजूद नहीं थे।

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