जावा 9 ने प्रोजेक्ट आरा के साथ मॉड्यूलर रनटाइम छवियों का विचार पेश किया और आधिकारिक तौर पर जावा रनटाइम को मोनोलिथिक कलाकृतियों के रूप में शिपिंग की समस्या को हल किया। मोनोलिथिक रनटाइम छवियां न केवल स्मृति उपयोग पर भारी थीं बल्कि इस पर चल रहे एप्लिकेशन के समग्र प्रदर्शन को भी धीमा कर देती थीं। अब हम उस पर चलने वाले अनुप्रयोगों की व्यक्तिगत जरूरतों के आधार पर JRE का एक अनुकूलित सबसेट पैक कर सकते हैं और उनकी दक्षता को कई गुना बढ़ा सकते हैं। यह लेख जावा 9 के साथ पेश की गई कस्टम रनटाइम छवियों की इस विशेषता पर एक समग्र नज़र डालता है।
एक सिंहावलोकन
जावा 9 के साथ मॉड्यूलर रनटाइम इमेज बनाने के विचार का प्रभाव बहुत बड़ा है। यह उस प्लेटफॉर्म से कस्टम निर्मित एप्लिकेशन के लिए दरवाजा खोलता है जिस पर यह चलता है। जावा प्लेटफॉर्म प्रत्येक नए संस्करण के साथ अपनी कार्यक्षमता बढ़ा रहा है। यह कोई आश्चर्य की बात नहीं है कि किसी बिंदु पर रनटाइम एक मोनोलिथिक आर्टिफैक्ट होगा और स्मृति और प्रदर्शन पर भारी टोल लेगा। इस वजह से, डेवलपर्स लंबे समय से इस समस्या से बाहर निकलने का रास्ता मांग रहे हैं। साथ ही, अधिकांश प्रोग्राम जावा प्लेटफॉर्म का पूरी तरह से उपयोग नहीं करते हैं। यदि किसी प्रोग्राम को प्रदर्शन और मेमोरी उपयोग के लिए अनुकूलित किया जा सकता है, तो जिस प्लेटफॉर्म पर वह चलता है उसे भी अनुकूलित क्यों नहीं किया जा सकता है? Java 8 ने प्रारंभिक कदम उठाया और कॉम्पैक्ट प्रोफाइल . के साथ इसके कुछ पहलू को लागू करने का प्रयास किया . Java 9 ने इसे आगे बढ़ाया और बिना किसी बाधा के रनटाइम छवियों को कस्टम बनाने का एक तरीका लागू किया जो कॉम्पैक्ट प्रोफाइल थोपा। इसने रनटाइम इमेज की पैकेजिंग में समग्र दृष्टिकोण अपनाया। इस सुविधा को सक्षम करने के लिए प्लेटफॉर्म को ही मॉड्यूलर किया गया है। मॉड्यूल में पैक किए गए एप्लिकेशन कोड को कस्टम रनटाइम छवियों के साथ भेजा जा सकता है जिसमें केवल वे प्लेटफ़ॉर्म मॉड्यूल होते हैं जो एप्लिकेशन द्वारा उपयोग किए जाते हैं। इस प्रकार, एक एप्लिकेशन प्रोग्राम एक एकल बंडल आर्टिफैक्ट हो सकता है जिसमें कस्टम जेआरई शामिल है। यह निश्चित रूप से प्रदर्शन का लाभ उठाता है, कम मेमोरी फुटप्रिंट के साथ स्टार्टअप समय प्रदान करता है। यदि एप्लिकेशन क्लाउड में चलता है, तो ये नेटवर्क ओवरलोड और डाउनलोड समय को काफी कम कर देते हैं।
संक्षिप्त प्रोफ़ाइल
हालांकि जावा 9 कॉम्पैक्ट प्रोफाइल . की अवधारणा से आगे निकल गया है जावा 8 के साथ पेश किया गया है, यह अक्सर मील के पत्थर को समझने और उसकी सराहना करने में मददगार होता है। एक तरह से, Java 9 ने इस विचार पर ध्यान दिया और कॉम्पैक्ट प्रोफ़ाइल . की अवधारणा को उन्नत किया अधिक समग्र तरीके से।
एक संक्षिप्त प्रोफ़ाइल जावा एसई प्लेटफॉर्म एपीआई के सबसेट को परिभाषित करता है जो जावा रनटाइम के स्थिर आकार को कम कर सकता है। यह विचार मूल रूप से संसाधन-विवश उपकरणों पर काम करने के लिए लक्षित है, जिनकी भंडारण क्षमता कम है, जैसे कि एक एम्बेडेड डिवाइस। मूल रूप से तीन प्रोफ़ाइल हैं, जिन्हें compact1 . कहा जाता है , कॉम्पैक्ट2 , और कॉम्पैक्ट3 . प्रत्येक उच्च क्रमांकित प्रोफ़ाइल अपने निचले क्रमांकित प्रोफ़ाइल का एक सुपर-सेट है। इसका मतलब है कि कॉम्पैक्ट1 compact2 . का उचित उपसमुच्चय है , कॉम्पैक्ट2 compact3 . का उचित उपसमुच्चय है , और कॉम्पैक्ट3 , बदले में, पूर्ण स्टैक Java 8 SE API का एक उचित उपसमुच्चय है।
संदर्भ:
- कॉम्पैक्ट प्रोफाइल, जावा एसई 8 दस्तावेज़ीकरण
- जावा एसई एंबेडेड 8 कॉम्पैक्ट प्रोफाइल अवलोकन
- जावा 8 कॉम्पैक्ट प्रोफाइल का परिचय
पेश है JIMAGE
JIMAGE कस्टम रनटाइम छवियों को संग्रहीत करने के लिए Java 9 के साथ पेश किया गया एक विशेष फ़ाइल स्वरूप है। यह फ़ाइल स्वरूप प्रदर्शन और भंडारण के लिए अनुकूलित है। फ़ाइल प्रारूप मूल रूप से JDK संसाधनों, कक्षाओं और मॉड्यूल के लिए एक कंटेनर के रूप में कार्य करता है, और उन्हें त्वरित खोज और तेज़ वर्ग लोडिंग के लिए अनुक्रमित करता है। JARs और JMODs जैसे अन्य फ़ाइल स्वरूपों के विपरीत, JIMAGE का उपयोग शायद ही कभी डेवलपर द्वारा किया जाता है क्योंकि यह JDK इंटर्नल से संबंधित होता है, सिवाय इसके कि जब कोई कस्टम रनटाइम छवि बनाना चाहता हो। JIMAGE के साथ JARs या JMODs के साथ क्लास लोडिंग तेज है क्योंकि इसे विशेष रूप से इसके लिए अनुकूलित किया गया है। साथ ही, JIMAGE का उपयोग केवल रनटाइम पर ही किया जा सकता है। JIMAGE अभी अपने शुरुआती वर्षों में है। बहुत कम डेवलपर जानकारी उपलब्ध है; शायद बाद में और उजागर किया जाएगा।
कस्टम इमेज बनाना
Java 9 jlink . की आपूर्ति करता है प्लेटफ़ॉर्म-विशिष्ट रनटाइम इमेज बनाने के लिए टूल। कस्टम छवियों में एप्लिकेशन विशिष्ट मॉड्यूल और प्लेटफ़ॉर्म के आवश्यक मॉड्यूल होते हैं। चूंकि रनटाइम छवि उर्फ जेआरई का आकार न्यूनतम हो गया है, इसलिए जेआरई के साथ आवेदन छवि भी न्यूनतम है। यह कार्यक्रम के साथ जेआरई को डिलीवरी की एकल इकाई के रूप में बंडल करता है। jlink टूल /bin . में स्थित है JDK9 . की निर्देशिका स्थापित निर्देशिका। इस टूल से जुड़े कई विकल्प उपलब्ध हैं जिनका उपयोग आवश्यकता के अनुसार किया जा सकता है। विवरण –सहायता . का उपयोग करके प्राप्त किया जा सकता है jlink . के साथ उपलब्ध विकल्प आज्ञा। यहां, इसे सुविधा के लिए निकाला गया है, या आप jlink –help . टाइप कर सकते हैं निम्न सूची प्राप्त करने के लिए कमांड लाइन में।
उपयोग:
jlink <options> --module-path <modulepath> --add-modules <module>[,<module>...]
विकल्प | विवरण |
-add-modules | समाधान के लिए रूट मॉड्यूल |
–bind-services | सेवा प्रदाता मॉड्यूल और उनकी निर्भरता में लिंक करें |
-सी, -कंप्रेस=<0|1|2>पी>
-अक्षम-प्लगइन <प्लगइननाम> -एंडियन <छोटा|बड़ा> | संसाधनों का संपीड़न सक्षम करें: स्तर 0:कोई संपीड़न नहीं स्तर 1:लगातार स्ट्रिंग साझाकरण स्तर 2:ज़िप उल्लिखित प्लग-इन अक्षम करें जनरेट किए गए जिमेज का बाइट क्रम (डिफ़ॉल्ट:नेटिव) |
-एच, -सहायता -अनदेखा-हस्ताक्षर-सूचना
-लॉन्चर <नाम>=<मॉड्यूल>[/<मेनक्लास>]
-सीमा-मॉड्यूल -सूची-प्लग-इन | इस सहायता संदेश को प्रिंट करें छवि में हस्ताक्षरित मॉड्यूलर JARs लिंक होने पर एक घातक त्रुटि को रोकें। हस्ताक्षरित मॉड्यूलर JARs की हस्ताक्षर-संबंधित फ़ाइलें रनटाइम छवि में कॉपी नहीं की जाती हैं। यदि निर्दिष्ट हो तो मॉड्यूल और मुख्य वर्ग के लिए दिए गए नाम का लॉन्चर कमांड जोड़ें। देखने योग्य मॉड्यूल के ब्रह्मांड को सीमित करें। उपलब्ध प्लग-इन की सूची बनाएं। |
-पी, -मॉड्यूल-पथ <पथ> पी> -नो-हेडर-फाइलें -नो-मैन-पेज -आउटपुट <पथ>पी> -सेव-ऑप्ट्स <फ़ाइल नाम> | मॉड्यूल पथ शीर्षलेख फ़ाइलें शामिल न करें मैन पेज बहिष्कृत करें आउटपुट पथ का स्थान दी गई फाइल में jlink विकल्पों को सेव करें |
-जी, -स्ट्रिप-डीबग -सुझाव-प्रदाताओं [<नाम>,…] | स्ट्रिप डीबग जानकारी उन प्रदाताओं का सुझाव दें जो दिए गए सेवा प्रकारों को मॉड्यूल पथ से लागू करते हैं |
-v, -verbose -संस्करण @<फ़ाइल नाम>पी> | वर्बोज़ ट्रेसिंग सक्षम करें संस्करण की जानकारी फ़ाइल से विकल्प पढ़ें |
एक साधारण उदाहरण
यहां, हम शुरुआत से अंत तक एक बहुत ही सरल प्रोग्राम के माध्यम से चलेंगे कि जावा एप्लिकेशन की रनटाइम इमेज कैसे बनाई जाए। हम मान लेंगे कि JDK9 ठीक से स्थापित है और पथ और JAVA_HOME पर्यावरण चर उचित रूप से सेट हैं। मेरे मामले में, इसे निम्नानुसार स्थापित और सेट किया गया है (लिनक्स प्लेटफॉर्म पर):
- JDK9 संस्थापित निर्देशिका /usr/lib/jvm/java-9-oracle
- पथ /usr/lib/jvm/java-9-oracle/bin . पर सेट है
- JAVA_HOME /usr/lib/jvm/java-9-oracle . पर सेट है
चरण 1
/Home/SampleProject . नामक निर्देशिका बनाएं और एक src इसके अंदर निर्देशिका (उदाहरण के लिए, /Home/SampleProject/src )।
चरण 2
org.app.test . नाम की निर्देशिका बनाएं src . के अंदर निर्देशिका (उदाहरण के लिए, /Home/SampleProject/src/org.app.test )।
चरण 3
अब, org.app.test . के अंदर निर्देशिका, मॉड्यूल-info.java . नाम की एक फ़ाइल बनाएं . और, निम्न सामग्री टाइप करें:
module org.app.test{ requires javafx.controls; exports org.app.test; }
चरण 4
अब, org, ऐप, टेस्ट . नाम की एक डायरेक्टरी बनाएं एक दूसरे के अंदर (उदाहरण के लिए, org.app.test/org/app/test ) और फिर MyApplication.java . नाम की एक फाइल बनाएं परीक्षण . के अंदर निर्देशिका और निम्नलिखित सामग्री टाइप करें:
package org.app.test; import javafx.application.Application; import javafx.scene.control.Alert; import javafx.scene.control.ButtonType; import javafx.stage.Stage; public class MyApplication extends Application{ public static void main(String[] args) { Application.launch(args); } @Override public void start(Stage stage) throws Exception { Alert alert = new Alert(Alert.AlertType.INFORMATION); alert.setTitle("Congratulation!"); alert.setHeaderText("You did it. The application is running. Press OK to close"); alert.setContentText("You have successfully created a custom image"); alert.showAndWait().ifPresent(rs -> { if (rs == ButtonType.OK) { System.out.println("Pressed OK."); } }); } }
चरण 5
एक /होम/सैंपलप्रोजेक्ट/मोड बनाएं निर्देशिका। यहां, हम संकलित कोड को सहेजेंगे। स्रोत कोड को निम्नानुसार संकलित करें। वर्तमान कार्यशील निर्देशिका /Home/SampleProject है ।
javac -d mods --module-source-path src src/org.app.test/module-info.java src/org.app.test/org/app/test/MyApplication.java
चरण 6
अब, JAR फ़ाइल बनाते हैं और उसे lib . में संग्रहीत करते हैं निर्देशिका (जैसे /Home/SampleProject/lib ) इस प्रकार है:
jar --create --file lib/org.app.test.jar --main-class org.app.test.MyApplication -C mods/org.app.test .
चरण 7
परीक्षण करने के लिए, एप्लिकेशन को निम्नानुसार चलाएँ:
java --module-path lib -m org.app.test
चरण 8
अब, JMOD फ़ाइल बनाते हैं और इसे jmods . में सहेजते हैं निर्देशिका (उदाहरण के लिए, होम/नमूनापरियोजना/jmods ):
jmod create --class-path lib/org.app.test.jar jmods/org.app.test.jmod
चरण 9
अंत में, निम्न कमांड का उपयोग करके कस्टम इमेज बनाते हैं:
jlink --module-path /usr/lib/jvm/java-9-oracle/jmods/:jmods --add-modules org.app.test --launcher runapp=org.app.test --output dist
इससे dist . नाम का फोल्डर बन जाएगा जिसमें वह सब शामिल है जो एप्लिकेशन को चलाने के लिए आवश्यक है। प्रोग्राम, लॉन्चर नाम के साथ runapp . दिया गया है , जिला/बिन . में निहित है निर्देशिका। इसे चलाने के लिए डबल-क्लिक करें।
चित्र 1: प्रोग्राम चल रहा है
बस इतना ही।
निष्कर्ष
इस आलेख में प्रयुक्त प्रत्येक आदेश विकल्प पर विस्तृत विवरण के लिए उपयुक्त दस्तावेज़ देखें। एक साधारण प्रोग्राम आज़माएं और इसे शुरू से अंत तक बनाएं। यह थोड़ा अधिक जटिल कार्यक्रम के साथ प्रयोग करने के लिए आवश्यक आत्मविश्वास का निर्माण करेगा, जैसे कि एक से अधिक मॉड्यूल का उपयोग करना और उनकी निर्भरता से निपटना। JDK9 ने डेवलपर्स को अपने रनटाइम बैगेज को केवल आवश्यक मॉड्यूल से भरने के लिए तैयार करने का अधिकार दिया है। यह अद्भुत और उत्कृष्ट है, हम में से अधिकांश जावा से लंबे समय से उम्मीद कर रहे हैं। एक जावा एप्लिकेशन अब उस सामान को बंद कर सकता है जिसे उसे स्पष्ट रूप से बहुत कम कारण के लिए ले जाना था और वितरण में अनुकूलित प्लेटफॉर्म बन गया।