Java Language
मल्टी-रिलीज़ जार फाइलें
खोज…
परिचय
जावा 9 में शुरू की गई सुविधाओं में से एक बहु-रिलीज़ जार (MRJAR) है जो एक ही जार फ़ाइल के भीतर कई जावा रिलीज़ को लक्षित करने वाले कोड को बंडल करने की अनुमति देता है। JEP 238 में यह सुविधा निर्दिष्ट है।
मल्टी-रिलीज़ जार फ़ाइल की सामग्री का उदाहरण
Multi-Release: true
MANIFEST.MF फ़ाइल में सेट करके, जार फ़ाइल बहु-रिलीज़ जार और जावा रनटाइम बन जाती है (जब तक यह MRJAR प्रारूप का समर्थन करता है) वर्तमान प्रमुख संस्करण के आधार पर कक्षाओं के उपयुक्त संस्करणों को चुन लेगा ।
इस तरह के जार की संरचना निम्नलिखित है:
jar root
- A.class
- B.class
- C.class
- D.class
- META-INF
- versions
- 9
- A.class
- B.class
- 10
- A.class
- JDKs <9 पर, रूट प्रविष्टि में केवल कक्षाएं जावा रनटाइम के लिए दिखाई देती हैं।
- JDK 9 पर, क्लास A और B को डायरेक्टरी
root/META-INF/versions/9
से लोड किया जाएगा, जबकि C और D को बेस एंट्री से लोड किया जाएगा। - JDK 10 पर, क्लास A को डायरेक्टरी
root/META-INF/versions/10
से लोड किया जाएगा।
जार टूल का उपयोग करके मल्टी-रिलीज़ जार बनाना
jar
कमांड का उपयोग एक बहु-रिलीज़ जार बनाने के लिए किया जा सकता है जिसमें जावा 8 और जावा 9 दोनों के लिए संकलित एक ही वर्ग के दो संस्करण हैं, यद्यपि चेतावनी के साथ यह बताना कि कक्षाएं समान हैं:
C:\Users\manouti>jar --create --file MR.jar -C sampleproject-base demo --release 9 -C sampleproject-9 demo
Warning: entry META-INF/versions/9/demo/SampleClass.class contains a class that
is identical to an entry already in the jar
--release 9
विकल्प jar
को बताता है कि सब कुछ शामिल है, जो root/META-INF/versions/9
तहत MRJAR में एक संस्करण प्रविष्टि के अंदर ( sampleproject-9
निर्देशिका के अंदर demo
पैकेज) शामिल है। परिणाम निम्नलिखित सामग्री है:
jar root
- demo
- SampleClass.class
- META-INF
- versions
- 9
- demo
- SampleClass.class
चलिए अब Main नामक एक क्लास बनाते हैं, जो SampleClass
के URL को प्रिंट करता है, और इसे जावा 9 संस्करण के लिए जोड़ता है:
package demo;
import java.net.URL;
public class Main {
public static void main(String[] args) throws Exception {
URL url = Main.class.getClassLoader().getResource("demo/SampleClass.class");
System.out.println(url);
}
}
यदि हम इस वर्ग को संकलित करते हैं और जार कमांड को फिर से चलाते हैं, तो हमें एक त्रुटि मिलती है:
C:\Users\manouti>jar --create --file MR.jar -C sampleproject-base demo --release 9 -C sampleproject-9 demoentry: META-INF/versions/9/demo/Main.class, contains a new public class not found in base entries
Warning: entry META-INF/versions/9/demo/Main.java, multiple resources with same name
Warning: entry META-INF/versions/9/demo/SampleClass.class contains a class that
is identical to an entry already in the jar
invalid multi-release jar file MR.jar deleted
कारण यह है कि jar
टूल सार्वजनिक कक्षाओं को वर्जन प्रविष्टियों में जोड़ने से रोकता है अगर उन्हें आधार प्रविष्टियों में भी नहीं जोड़ा जाता है। ऐसा इसलिए किया जाता है ताकि MRJAR विभिन्न जावा संस्करणों के लिए एक ही सार्वजनिक एपीआई को उजागर करे। ध्यान दें कि रनटाइम में, इस नियम की आवश्यकता नहीं है। यह केवल jar
जैसे उपकरणों द्वारा लागू किया जा सकता है। इस विशेष मामले में, Main
का उद्देश्य नमूना कोड चलाना है, इसलिए हम बस आधार प्रविष्टि में एक प्रति जोड़ सकते हैं। यदि कक्षा एक नए कार्यान्वयन का हिस्सा थी जिसे हमें केवल जावा 9 की आवश्यकता थी, तो इसे गैर-सार्वजनिक बनाया जा सकता था।
Main
प्रविष्टि को मूल प्रविष्टि में जोड़ने के लिए, हमें पहले प्री-जावा 9 रिलीज़ को लक्षित करने के लिए इसे संकलित करना होगा। यह javac
के नए --release
विकल्प का उपयोग करके किया जा सकता है:
C:\Users\manouti\sampleproject-base\demo>javac --release 8 Main.java
C:\Users\manouti\sampleproject-base\demo>cd ../..
C:\Users\manouti>jar --create --file MR.jar -C sampleproject-base demo --release 9 -C sampleproject-9 demo
मुख्य वर्ग को चलाने से पता चलता है कि नमूनाक्लास संस्करण निर्देशिका से लोड हो जाता है:
C:\Users\manouti>java --class-path MR.jar demo.Main
jar:file:/C:/Users/manouti/MR.jar!/META-INF/versions/9/demo/SampleClass.class
बहु-रिलीज़ जार के अंदर एक लोडेड क्लास का URL
निम्नलिखित बहु-रिलीज़ जार को देखते हुए:
jar root
- demo
- SampleClass.class
- META-INF
- versions
- 9
- demo
- SampleClass.class
निम्न वर्ग SampleClass
के URL को प्रिंट करता है:
package demo;
import java.net.URL;
public class Main {
public static void main(String[] args) throws Exception {
URL url = Main.class.getClassLoader().getResource("demo/SampleClass.class");
System.out.println(url);
}
}
यदि कक्षा को एमआरजेएआर में जावा 9 के लिए संस्करण प्रविष्टि में संकलित और जोड़ा जाता है, तो इसे चलाने से परिणाम होगा:
C:\Users\manouti>java --class-path MR.jar demo.Main
jar:file:/C:/Users/manouti/MR.jar!/META-INF/versions/9/demo/SampleClass.class