जावा में, आप अक्सर कुछ मेटा फ़ाइलों से युक्त META-INF फ़ोल्डर देखते हैं। इस फ़ोल्डर का उद्देश्य क्या है और मैं वहां क्या डाल सकता हूं?
जावा में, आप अक्सर कुछ मेटा फ़ाइलों से युक्त META-INF फ़ोल्डर देखते हैं। इस फ़ोल्डर का उद्देश्य क्या है और मैं वहां क्या डाल सकता हूं?
जवाबों:
सामान्यतया, आपको अपने आप में कुछ भी नहीं डालना चाहिए। इसके बजाय, आपको अपने जेएआर को पैकेज करने के लिए जो भी उपयोग करना चाहिए उस पर भरोसा करना चाहिए। यह उन क्षेत्रों में से एक है जहां मुझे लगता है कि चींटी वास्तव में एक्सेल: जार फ़ाइल प्रकट विशेषताओं को निर्दिष्ट करती है। कुछ कहना बहुत आसान है:
<jar ...>
<manifest>
<attribute name="Main-Class" value="MyApplication"/>
</manifest>
</jar>
कम से कम, मुझे लगता है कि यह आसान है ... :-)
मुद्दा यह है कि मेटा-इन को एक आंतरिक जावा मेटा निर्देशिका माना जाना चाहिए । इसके साथ गड़बड़ मत करो! अपने JAR के साथ आप जो भी फ़ाइलें शामिल करना चाहते हैं, उन्हें किसी अन्य उप-निर्देशिका में या JAR के मूल में रखा जाना चाहिए।
से आधिकारिक JAR फ़ाइल विशिष्टता (लिंक जावा 7 संस्करण के लिए चला जाता है, लेकिन कम से कम पाठ v1.3 पर के बाद से नहीं बदला है):
मेटा-इन निर्देशिका
META-INF निर्देशिका में निम्नलिखित फाइलें / निर्देशिकाएं अनुप्रयोगों, एक्सटेंशन, क्लास लोडर और सेवाओं को कॉन्फ़िगर करने के लिए जावा 2 प्लेटफॉर्म द्वारा पहचानी और व्याख्या की जाती हैं:
MANIFEST.MF
विस्तार और पैकेज संबंधित डेटा को परिभाषित करने के लिए उपयोग की जाने वाली मैनिफ़ेस्ट फ़ाइल।
INDEX.LIST
यह फ़ाइल
-i
जार टूल के नए " " विकल्प से उत्पन्न होती है , जिसमें एप्लिकेशन या एक्सटेंशन में परिभाषित पैकेजों के लिए स्थान की जानकारी होती है। यह JarIndex कार्यान्वयन का हिस्सा है और इसका उपयोग क्लास लोडर द्वारा अपनी क्लास लोडिंग प्रक्रिया को तेज करने के लिए किया जाता है।
x.SF
JAR फ़ाइल के लिए हस्ताक्षर फ़ाइल। 'x' का आधार फ़ाइल नाम है।
x.DSA
एक ही आधार फ़ाइल नाम के साथ हस्ताक्षर फ़ाइल से जुड़ी हस्ताक्षर ब्लॉक फ़ाइल। यह फ़ाइल संबंधित हस्ताक्षर फ़ाइल के डिजिटल हस्ताक्षर को संग्रहीत करती है।
services/
यह निर्देशिका सभी सेवा प्रदाता कॉन्फ़िगरेशन फ़ाइलों को संग्रहीत करती है।
मैंने देखा है कि कुछ जावा पुस्तकालयों ने एक निर्देशिका के रूप में मेटा-इन का उपयोग करना शुरू कर दिया है, जिसमें कॉन्फ़िगरेशन फाइलें शामिल हैं जिन्हें पैक किया जाना चाहिए और जार के साथ CLASSPATH में शामिल किया जाना चाहिए। उदाहरण के लिए, स्प्रिंग आपको एक्सएमएल फ़ाइलों को आयात करने की अनुमति देता है जो क्लासपाथ पर हैं:
<import resource="classpath:/META-INF/cxf/cxf.xml" />
<import resource="classpath:/META-INF/cxf/cxf-extensions-*.xml" />
इस उदाहरण में, मैं सीधे अपाचे सीएक्सएफ यूजर गाइड से उद्धृत कर रहा हूं । एक परियोजना पर मैंने काम किया जिसमें हमें वसंत के माध्यम से कई स्तरों के कॉन्फ़िगरेशन की अनुमति दी गई थी, हमने इस सम्मेलन का अनुसरण किया और अपनी कॉन्फ़िगरेशन फ़ाइलों को मेटा-इन में डाल दिया।
जब मैं इस निर्णय पर विचार करता हूं, तो मुझे नहीं पता कि वास्तव में META-INF के बजाय एक विशिष्ट जावा पैकेज में कॉन्फ़िगरेशन फ़ाइलों को शामिल करने में क्या गलत होगा। लेकिन यह एक उभरता हुआ वास्तविक मानक प्रतीत होता है; या तो, या एक उभरते विरोधी पैटर्न :-)
META-INF फ़ोल्डर MANIFEST.MF फ़ाइल का घर है । इस फ़ाइल में JAR की सामग्री के बारे में मेटा डेटा है। उदाहरण के लिए, एक प्रविष्टि है जिसे मेन-क्लास कहा जाता है जो निष्पादन योग्य JAR फ़ाइलों के लिए स्थैतिक मुख्य () के साथ जावा वर्ग का नाम निर्दिष्ट करता है।
आप वहां स्थैतिक संसाधन भी रख सकते हैं।
उदाहरण में:
META-INF/resources/button.jpg
और के माध्यम से web3.0 कंटेनर में उन्हें मिलता है
http://localhost/myapp/button.jpg
/META-INF/MANIFEST.MF का एक विशेष अर्थ है:
java -jar myjar.jar org.myserver.MyMainClass
तो आप मुख्य वर्ग की परिभाषा को जार में ले जा सकते हैं ताकि आप कॉल को सिकोड़ सकें java -jar myjar.jar
।java.lang.Package.getPackage("org.myserver").getImplementationTitle()
।मेंवेन- इन फोल्डर को मानक निर्देशिका लेआउट के कारण समझा जाता है , जो कि कन्वेंशन पैकेज के नाम से JAR के भीतर आपके प्रोजेक्ट संसाधनों को पैकेज करता है: कोई भी निर्देशिका या फाइल जो $ {आधारित है / src / main / main / resource डायरेक्टरी में आपके JAR में पैक की जाती है। JAR के आधार पर शुरू होने वाली सटीक संरचना के साथ। फ़ोल्डर $ {आधारित /} / src / main / Resources / META-INF में आमतौर पर .properties फाइलें होती हैं, जबकि जार में एक उत्पन्न MANIFEST.MF , pom.properties , pom.xml , सहित अन्य फाइलें होती हैं। वेब संसाधनों की सेवा के लिए स्प्रिंग जैसे ढांचे का भी उपयोग किया classpath:/META-INF/resources/
जाता है। अधिक जानकारी के लिए देखेंमैं अपने मावेन प्रोजेक्ट में संसाधनों को कैसे जोड़ूं ।
WAR फ़ाइल के मामले में, यहाँ जानकारी को जोड़ने के लिए, META-INF / MANIFEST.MF फ़ाइल डेवलपर को कंटेनर द्वारा एक नियत समय जाँच आरंभ करने की सुविधा प्रदान करती है जो यह सुनिश्चित करता है कि कंटेनर आपके सभी एप्लिकेशनों को ढूंढ सकता है निर्भर करता है। यह सुनिश्चित करता है कि यदि आपने एक JAR को याद किया है, तो आपको तब तक इंतजार नहीं करना होगा जब तक कि आपके आवेदन को यह न पता हो कि यह गायब है।
मैं इस मुद्दे पर हाल ही में सोच रहा हूं। वास्तव में META-INF के उपयोग पर कोई प्रतिबंध नहीं लगता है। निश्चित रूप से, कुछ सख्त हैं, जाहिर तौर पर वहाँ प्रकट करने की आवश्यकता के बारे में, लेकिन वहाँ किसी भी सामान को रखने के बारे में कोई निषेध नहीं है।
यह एक केस क्यों है?
Cxf मामला वैध हो सकता है। यहां एक और जगह है जहां इस गैर-मानक को JBoss-ws में एक बुरा बग के आसपास पाने की सिफारिश की गई है जो एक wsdl के स्कीमा के खिलाफ सर्वर-साइड सत्यापन को रोकता है।
http://community.jboss.org/message/570377#570377
लेकिन वास्तव में कोई भी मानक, कोई तू-तू-मैं-मैं नहीं होता है। आमतौर पर इन चीजों को बहुत सख्ती से परिभाषित किया जाता है, लेकिन किसी कारण से, ऐसा लगता है कि यहां कोई मानक नहीं हैं। अजीब। ऐसा लगता है कि META-INF किसी भी आवश्यक कॉन्फ़िगरेशन के लिए एक ऐसा स्थान बन गया है जिसे आसानी से किसी अन्य तरीके से नियंत्रित नहीं किया जा सकता है।
यहां जानकारी में जोड़ना, META-INF एक विशेष फ़ोल्डर है जो ClassLoader
जार में अन्य फ़ोल्डरों से अलग तरह से व्यवहार करता है। META-INF फ़ोल्डर के अंदर नेस्टेड तत्वों को इसके बाहर के तत्वों के साथ नहीं मिलाया जाता है।
इसे दूसरी जड़ की तरह समझें। से Enumerator<URL> ClassLoader#getSystemResources(String path)
विधि एट अल परिप्रेक्ष्य:
जब दिया गया पथ "META-INF" से शुरू होता है, तो विधि उन संसाधनों की खोज करती है जो वर्ग पथ में सभी जार के META-INF फ़ोल्डरों के अंदर होते हैं।
जब दिया गया पथ "META-INF" से प्रारंभ नहीं होता है, तो विधि वर्ग पथ के सभी जार और निर्देशिकाओं के सभी अन्य फ़ोल्डरों (META-INF के बाहर) में संसाधनों की खोज करती है।
यदि आप किसी अन्य फ़ोल्डर नाम के बारे में जानते हैं जो getSystemResources
विधि विशेष रूप से व्यवहार करती है, तो कृपया इसके बारे में टिप्पणी करें।
यदि आप JPA1 का उपयोग कर रहे हैं, तो आपको persistence.xml
वहां एक फ़ाइल छोड़नी पड़ सकती है जो एक दृढ़ता-इकाई का नाम निर्दिष्ट करती है जिसे आप उपयोग करना चाहते हैं। एक दृढ़ता-इकाई मेटाडेटा फ़ाइलों, और वर्गों के सेट को निर्दिष्ट करने का एक सुविधाजनक तरीका प्रदान करती है, और जार जिसमें सभी वर्गों को एक समूह में बनाए रखा जाना है।
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
// ...
EntityManagerFactory emf =
Persistence.createEntityManagerFactory(persistenceUnitName);
यहाँ और देखें: http://www.datanucleus.org/products/datanucleus/jpa/emf.html
सभी उत्तर सही हैं। मेटा-इन के कई उद्देश्य हैं। इसके अलावा, यहां टॉमकैट कंटेनर का उपयोग करने के बारे में एक उदाहरण है।
टॉमकैट डॉक्टर पर जाएं और " मानक कार्यान्वयन> copyXML " विशेषता की जांच करें।
विवरण नीचे है।
यदि आप एक संदर्भ XML डिस्क्रिप्टर अनुप्रयोग के अंदर एम्बेडेड (/META-INF/context.xml पर स्थित) चाहते हैं तो सही पर सेट करें, जब एप्लिकेशन को तैनात किया गया हो तब होस्ट करने वाले xmlBase में कॉपी किया जाना चाहिए। बाद में शुरू होने पर, कॉपी किए गए संदर्भ एक्सएमएल डिस्क्रिप्टर का उपयोग किसी भी संदर्भ में प्राथमिकता के लिए किया जाएगा एक्सएमएल डिस्क्रिप्टर एप्लिकेशन के अंदर एम्बेडेड है, भले ही डिस्क्रिप्टर एप्लिकेशन के अंदर एम्बेडेड हो हाल ही में। झंडे का मूल्य असत्य की ओर जाता है। ध्यान दें कि यदि मालिक की होस्ट की XXML विशेषता गलत है या यदि स्वयं के होस्ट की CopyXML विशेषता सही है, तो इस विशेषता का कोई प्रभाव नहीं होगा।
आपके पास META-INF फ़ोल्डर में MANIFEST.MF फ़ाइल है। आप वैकल्पिक या बाहरी निर्भरता को परिभाषित कर सकते हैं, जिसकी आपको पहुंच होनी चाहिए।
उदाहरण:
विचार करें कि आपने अपना ऐप और अपना कंटेनर तैनात किया है (रन टाइम पर) पता चला है कि आपके ऐप में लाइब्रेरी के नए संस्करण की आवश्यकता है जो कि लिबास फ़ोल्डर के अंदर नहीं है, उस स्थिति में यदि आपने वैकल्पिक नए संस्करण को परिभाषित किया है MANIFEST.MF
तो आपका ऐप संदर्भित करेगा वहाँ से निर्भरता (और दुर्घटना नहीं होगी)।
Source:
हेड फर्स्ट जेएसपी एंड सर्वलेट