मैंने देखा कि JAR, WAR और EAR फाइलों MANIFEST.MF
में META-INF
फ़ोल्डर के नीचे एक फाइल है ।
MANIFEST.MF
फ़ाइल का उपयोग क्या है ? इस फाइल में क्या सभी चीजें निर्दिष्ट की जा सकती हैं?
मैंने देखा कि JAR, WAR और EAR फाइलों MANIFEST.MF
में META-INF
फ़ोल्डर के नीचे एक फाइल है ।
MANIFEST.MF
फ़ाइल का उपयोग क्या है ? इस फाइल में क्या सभी चीजें निर्दिष्ट की जा सकती हैं?
जवाबों:
जावा डेवलपमेंट किट के संस्करण 1.0 के साथ बनाई गई JAR फ़ाइल में मेनिफेस्ट फ़ाइल की सामग्री निम्नलिखित है।
Manifest-Version: 1.0
सभी प्रविष्टियाँ नाम-मूल्य जोड़े के रूप में हैं। एक शीर्ष लेख का नाम एक बृहदान्त्र द्वारा उसके मूल्य से अलग किया जाता है। डिफ़ॉल्ट मेनिफ़ेस्ट दिखाता है कि यह मेनिफ़ेस्ट स्पेसिफिकेशन के संस्करण 1.0 के अनुरूप है। प्रकट में संग्रह में पैक की गई अन्य फ़ाइलों के बारे में जानकारी भी हो सकती है। वास्तव में क्या फ़ाइल जानकारी प्रकट में दर्ज की गई है, JAR फ़ाइल के लिए इच्छित उपयोग पर निर्भर करेगी। डिफ़ॉल्ट मैनिफ़ेस्ट फ़ाइल अन्य फ़ाइलों के बारे में क्या जानकारी रिकॉर्ड करनी चाहिए, इसके बारे में कोई धारणा नहीं है, इसलिए इसकी एकल पंक्ति में केवल अपने बारे में डेटा है। विशेष-प्रयोजन प्रकट प्रधान
JAR फ़ाइल की इच्छित भूमिका के आधार पर, डिफ़ॉल्ट मेनिफ़ेस्ट को संशोधित करना पड़ सकता है। यदि JAR फ़ाइल केवल अभिलेखीय उद्देश्य के लिए बनाई गई है, तो MANIFEST.MF फ़ाइल का कोई उद्देश्य नहीं है। JAR फ़ाइलों के अधिकांश उपयोग सरल संग्रह और संपीड़न से परे जाते हैं और विशेष जानकारी की आवश्यकता होती है जो कि मैनिफ़ेस्ट फ़ाइल में होती है। नीचे संक्षेप में उन शीर्ष लेखों का संक्षिप्त विवरण दिया गया है जो कुछ विशेष प्रयोजन JAR- फ़ाइल कार्यों के लिए आवश्यक हैं
JAR फ़ाइलों के रूप में बंडल किए गए अनुप्रयोग : यदि किसी अनुप्रयोग को JAR फ़ाइल में बंडल किया जाता है, तो जावा वर्चुअल मशीन को यह बताना होगा कि आवेदन का प्रवेश बिंदु क्या है। एक प्रवेश बिंदु सार्वजनिक स्थैतिक शून्य मुख्य (स्ट्रिंग [] args) विधि के साथ कोई भी वर्ग है। यह जानकारी मेन-क्लास हेडर में दी गई है, जिसमें सामान्य रूप है:
Main-Class: classname
मूल्य वर्गनाम को आवेदन के प्रवेश बिंदु के साथ प्रतिस्थापित किया जाना है।
एक्सटेंशन डाउनलोड करें : डाउनलोड एक्सटेंशन JAR फाइलें हैं जो अन्य JAR फाइलों की मैनिफ़ेस्ट फ़ाइलों द्वारा संदर्भित हैं। एक विशिष्ट स्थिति में, एक एप्लेट को JAR फाइल में बंडल किया जाएगा, जिसका प्रकटन एक JAR फाइल (या कई JAR फाइलें) को संदर्भित करता है जो उस एप्लेट के प्रयोजनों के लिए एक विस्तार के रूप में काम करेगा। एक्सटेंशन एक दूसरे को उसी तरह से संदर्भित कर सकते हैं। डाउनलोड एक्सटेंशन एक एप्लेट, एप्लिकेशन, या किसी अन्य एक्सटेंशन की मैनिफ़ेस्ट फ़ाइल में क्लास-पाथ हेडर फ़ील्ड में निर्दिष्ट हैं। एक क्लास-पाथ हैडर इस तरह दिख सकता है, उदाहरण के लिए:
Class-Path: servlet.jar infobus.jar acme/beans.jar
इस हेडर के साथ, फाइलें सर्वलेट.जर, इन्फोबस.जर और एकमे / बीन्स.जर में कक्षाएं एप्लेट या एप्लिकेशन के प्रयोजनों के लिए एक्सटेंशन के रूप में काम करेंगी। क्लास-पाथ हेडर के URL एपलेट या एप्लिकेशन के JAR फाइल के URL के सापेक्ष दिए गए हैं।
पैकेज सील: एक JAR फ़ाइल के भीतर एक पैकेज वैकल्पिक रूप से सील किया जा सकता है, जिसका अर्थ है कि उस पैकेज में परिभाषित सभी वर्गों को एक ही JAR फ़ाइल में संग्रहीत किया जाना चाहिए। आपके सॉफ़्टवेयर में या सुरक्षा उपाय के रूप में कक्षाओं के बीच संस्करण की स्थिरता सुनिश्चित करने के लिए एक पैकेज सील किया जा सकता है। पैकेज को सील करने के लिए, पैकेज के लिए एक नाम हेडर जोड़ा जाना चाहिए, उसके बाद एक सील्ड हेडर, इसी के समान है:
Name: myCompany/myPackage/
Sealed: true
नाम हेडर का मान पैकेज के सापेक्ष पथनाम है। ध्यान दें कि यह फ़ाइल नाम से अलग करने के लिए '/' के साथ समाप्त होता है। नाम हेडर के बाद कोई भी हेडर, बिना किसी हस्तक्षेप के खाली लाइनों के बिना, नाम हेडर में निर्दिष्ट फ़ाइल या पैकेज पर लागू होता है। उपरोक्त उदाहरण में, क्योंकि नाम के बाद सील हेडर होता है: myCompany / myPackage हेडर, के बीच कोई रिक्त रेखाओं के साथ, सील हेडर को केवल myCompany / myPackage पैकेज के लिए आवेदन (केवल) के रूप में व्याख्या की जाएगी।
पैकेज वर्जनिंग : पैकेज वर्जनिंग विनिर्देश संस्करण की जानकारी रखने के लिए कई प्रकट हेडर को परिभाषित करता है। ऐसे हेडर का एक सेट प्रत्येक पैकेज को सौंपा जा सकता है। संस्करण हेडर सीधे पैकेज के लिए नाम हेडर के नीचे दिखाई देना चाहिए। यह उदाहरण सभी संस्करण हेडर दिखाता है:
Name: java/util/
Specification-Title: "Java Utility Classes"
Specification-Version: "1.2"
Specification-Vendor: "Sun Microsystems, Inc.".
Implementation-Title: "java.util"
Implementation-Version: "build57"
Implementation-Vendor: "Sun Microsystems, Inc."
Manifest.MF में JAR फ़ाइल में शामिल फ़ाइलों के बारे में जानकारी है।
जब भी एक JAR फ़ाइल बनाई जाती है, तो एक डिफ़ॉल्ट मैनिफ़ेस्ट .ff फ़ाइल META-INF फ़ोल्डर के अंदर बनाई जाती है और इसमें इस तरह की डिफ़ॉल्ट प्रविष्टियाँ होती हैं:
Manifest-Version: 1.0
Created-By: 1.7.0_06 (Oracle Corporation)
ये "हेडर: वैल्यू" जोड़े के रूप में प्रविष्टियाँ हैं। पहला एक प्रकट संस्करण को निर्दिष्ट करता है और दूसरा JDK संस्करण निर्दिष्ट करता है जिसके साथ JAR फ़ाइल बनाई जाती है।
मेन-क्लास हेडर: जब किसी पैकेज में किसी एप्लिकेशन को बंडल करने के लिए JAR फाइल का उपयोग किया जाता है, तो हमें क्लास को एप्लिकेशन के एक एंट्री पॉइंट को निर्दिष्ट करने की आवश्यकता होती है। हम मेनिफ़ेस्ट फ़ाइल के 'मेन-क्लास' हेडर का उपयोग करके यह जानकारी प्रदान करते हैं,
मुख्य-वर्ग: {पूरी तरह से योग्य वर्गनाम}
यहाँ 'मेन-क्लास' मान मुख्य विधि वाली क्लास है। इस प्रविष्टि को निर्दिष्ट करने के बाद हम एप्लिकेशन को चलाने के लिए JAR फ़ाइल निष्पादित कर सकते हैं।
क्लास-पाथ हेडर: अधिकांश बार हमें एप्लिकेशन की JAR फ़ाइल के अंदर पैक की गई कक्षाओं से अन्य JAR फ़ाइलों को एक्सेस करने की आवश्यकता होती है। यह 'क्लास-पाथ' हेडर का उपयोग करते हुए मैनिफ़ेस्ट फ़ाइल में उनके पूरी तरह से योग्य पथ प्रदान करके किया जा सकता है,
क्लास-पाथ: {jar1-name jar2-name directory-name / jar3-name}
इस हैडर का उपयोग बाहरी JAR फ़ाइलों को एक ही स्थानीय नेटवर्क पर निर्दिष्ट करने के लिए किया जा सकता है और वर्तमान JAR के अंदर नहीं।
पैकेज संस्करण संबंधित हेडर: जब JAR फ़ाइल का उपयोग पैकेज संस्करण के लिए किया जाता है तो निम्नलिखित हेडर जावा भाषा विनिर्देश द्वारा निर्दिष्ट किए जाते हैं:
Headers in a manifest
Header | Definition
-------------------------------------------------------------------
Name | The name of the specification.
Specification-Title | The title of the specification.
Specification-Version | The version of the specification.
Specification-Vendor | The vendor of the specification.
Implementation-Title | The title of the implementation.
Implementation-Version | The build number of the implementation.
Implementation-Vendor | The vendor of the implementation.
पैकेज सील संबंधित हेडर:
हम यह भी निर्दिष्ट कर सकते हैं कि क्या JAR फ़ाइल के अंदर कोई विशेष पैकेज सील किया जाना चाहिए जिसका अर्थ है कि उस पैकेज में परिभाषित सभी वर्गों को एक ही JAR फ़ाइल में संग्रहीत किया जाना चाहिए। इसे 'सील' हेडर की मदद से निर्दिष्ट किया जा सकता है,
नाम: {पैकेज / कुछ-पैकेज /} सील: सच
यहां, पैकेज का नाम '/' के साथ समाप्त होना चाहिए।
मैनिफ़ेस्ट फ़ाइलों के साथ सुरक्षा बढ़ाना:
हम वेब एप्लिकेशन की सुरक्षा को सुनिश्चित करने के लिए प्रकट फाइलों की प्रविष्टियों का उपयोग कर सकते हैं या इसे अलग-अलग विशेषताओं के साथ पैकेज कर सकते हैं जैसे कि 'अनुमतियाँ', 'कोडबाई', 'एप्लिकेशन-नाम', 'ट्रस्टेड-ओनली' और कई और।
मेटा-इन फ़ोल्डर:
यह फ़ोल्डर वह जगह है जहाँ मेनिफ़ेस्ट फ़ाइल रहती है। इसके अलावा, इसमें एप्लिकेशन के बारे में मेटा डेटा वाली अधिक फाइलें हो सकती हैं। उदाहरण के लिए, EJB मॉड्यूल JAR फ़ाइल में, इस फ़ोल्डर में JJ के लिए प्रकट फ़ाइल के साथ EJB मॉड्यूल के लिए EJB परिनियोजन विवरणक शामिल है। इसके अलावा, इसमें xml फ़ाइल होती है जिसमें एक सार EJB के मैपिंग होती है जिसमें एप्लिकेशन सर्वर के कंक्रीट कंटेनर संसाधनों का संदर्भ होता है, जिस पर इसे चलाया जाएगा।
संदर्भ:
https://docs.oracle.com/javase/tutorial/deployment/jar/manifestindex.html