यह तुम्हारी पसंद है। जावा वेब एप्लिकेशन संग्रह (WAR) में मूल रूप से तीन तरीके हैं:
1. इसे क्लासपाथ में रखो
ताकि आप इसे ClassLoader#getResourceAsStream()
क्लासपाथ-रिलेटिव पाथ से लोड कर सकें :
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream input = classLoader.getResourceAsStream("foo.properties");
// ...
Properties properties = new Properties();
properties.load(input);
यहाँ foo.properties
जड़ों जो एक webapp, जैसे वेब ऐप्लिकेशन की डिफ़ॉल्ट classpath के अंतर्गत आते हैं में से एक में रखा जाना माना जाता है /WEB-INF/lib
और /WEB-INF/classes
, सर्वर /lib
, या JDK / JRE की /lib
। यदि propertiesfile वेब-विशिष्ट है, तो इसे इसमें रखना सबसे अच्छा है /WEB-INF/classes
। यदि आप एक IDE में एक मानक WAR परियोजना विकसित कर रहे हैं, तो इसे src
फ़ोल्डर (परियोजना के स्रोत फ़ोल्डर) में छोड़ दें। यदि आप मावेन परियोजना का उपयोग कर रहे हैं, तो इसे /main/resources
फ़ोल्डर में छोड़ दें ।
आप वैकल्पिक रूप से इसे डिफ़ॉल्ट क्लासपाथ के बाहर भी रख सकते हैं और अपने पथ को एब्जर्वर के क्लासपाथ में जोड़ सकते हैं। उदाहरण के लिए टॉमकैट आप इसे shared.loader
संपत्ति के रूप में कॉन्फ़िगर कर सकते हैं Tomcat/conf/catalina.properties
।
यदि आपने foo.properties
इसे जावा पैकेज संरचना में रखा है com.example
, तो आपको इसे नीचे लोड करने की आवश्यकता है
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream input = classLoader.getResourceAsStream("com/example/foo.properties");
// ...
ध्यान दें कि संदर्भ श्रेणी लोडर का यह पथ ए से शुरू नहीं होना चाहिए /
। केवल जब आप "रिश्तेदार" वर्ग लोडर का उपयोग कर रहे हैं SomeClass.class.getClassLoader()
, तो आपको वास्तव में इसे एक के साथ शुरू करने की आवश्यकता है /
।
ClassLoader classLoader = getClass().getClassLoader();
InputStream input = classLoader.getResourceAsStream("/com/example/foo.properties");
// ...
हालाँकि, गुण फ़ाइल की दृश्यता निर्भर करता है तब प्रश्न में वर्ग लोडर पर। यह केवल उसी श्रेणी लोडर को दिखाई देता है, जो कक्षा को लोड करता है। इसलिए, यदि क्लास को webapp क्लास लोडर के बजाय उदाहरण के लिए सर्वर कॉमन क्लास लोडर द्वारा लोड किया गया है, और गुण फ़ाइल वेबैप के अंदर ही है, तो यह अदृश्य है। संदर्भ वर्ग लोडर आपकी सबसे सुरक्षित शर्त है ताकि आप गुण फ़ाइल को "सर्वत्र" कक्षा में जगह दे सकें और / या आप वेब पर मौजूद किसी सर्वर-प्रदायक को ओवरराइड करने में सक्षम हों।
2. इसे वेब कॉन्टेंट में डालें
ताकि आप इसे ServletContext#getResourceAsStream()
वेब-कॉन्टेंट-रिलेटिव पाथ से लोड कर सकें :
InputStream input = getServletContext().getResourceAsStream("/WEB-INF/foo.properties");
// ...
ध्यान दें कि मैंने फ़ाइल को /WEB-INF
फ़ोल्डर में रखने के लिए प्रदर्शित किया है , अन्यथा यह किसी भी वेबब्रोसर द्वारा सार्वजनिक रूप से सुलभ होता। यह भी ध्यान दें कि ServletContext
किसी भी HttpServlet
वर्ग में विरासत में GenericServlet#getServletContext()
और अंदर Filter
तक ही पहुँचा जा सकता है FilterConfig#getServletContext()
। यदि आप सर्वलेट क्लास में नहीं हैं, तो यह आमतौर पर केवल इंजेक्शन के माध्यम से होता है @Inject
।
3. इसे लोकल डिस्क फाइल सिस्टम में डालें
ताकि आप इसे एक सामान्य java.io
स्थानीय डिस्क फ़ाइल सिस्टम पथ के साथ सामान्य तरीके से लोड कर सकें :
InputStream input = new FileInputStream("/absolute/path/to/foo.properties");
// ...
एक निरपेक्ष पथ का उपयोग करने के महत्व पर ध्यान दें। रिश्तेदार स्थानीय डिस्क फ़ाइल सिस्टम पथ एक जावा ईई वेब अनुप्रयोग में एक पूर्ण नहीं है। नीचे दिए गए पहले "सी भी देखें" लिंक भी देखें।
कौन सा चुनना है?
बस में लाभ / नुकसान का वजन अपने रख-रखाव की खुद की राय।
यदि गुण फाइलें "स्थिर" हैं और रनटाइम के दौरान कभी भी बदलने की आवश्यकता नहीं है, तो आप उन्हें WAR में रख सकते हैं।
यदि आप हर बार WAR के पुनर्निर्माण और पुनर्वितरण की आवश्यकता के बिना वेब एप्लिकेशन के बाहर से संपत्तियों की फ़ाइलों को संपादित करने में सक्षम होना पसंद करते हैं, तो इसे प्रोजेक्ट के बाहर क्लासपाथ में डालें (यदि आवश्यक हो तो डायरेक्टरी को क्लासपाथ में जोड़ें)।
यदि आप Properties#store()
विधि का उपयोग करके वेब अनुप्रयोग के अंदर से प्रोग्राम फ़ाइलों को संपत्तियों को संपादित करने में सक्षम होना पसंद करते हैं , तो इसे वेब एप्लिकेशन के बाहर रखें। जैसा कि Properties#store()
एक की आवश्यकता है Writer
, आप एक डिस्क फ़ाइल सिस्टम पथ का उपयोग करके चारों ओर नहीं जा सकते। वह रास्ता बदले में VM तर्क या सिस्टम प्रॉपर्टी के रूप में वेब एप्लिकेशन को दिया जा सकता है। एहतियात के तौर पर, कभी उपयोग न करेंgetRealPath()
। परिनियोजन फ़ोल्डर में सभी परिवर्तन साधारण कारण के लिए एक पुन: लोड पर खो जाएंगे कि मूल WAR फ़ाइल में परिवर्तन वापस दिखाई नहीं देते हैं।
यह सभी देखें: